質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1321閲覧

引数になにを入れればいいのかわからない。

imahh

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/12/17 15:58

編集2021/12/18 07:18

前提・実現したいこと

実現したいことはpic32を用いて加速度センサーから送らてくる情報を読むこと

ここに質問の内容を詳しく書いてください。
私の勉強不足なのですがこちらの関数を動かすにはどのような引数を渡せばいいのかわかりません。
やりたいことはただメイン関数内でこちらの関数を実行したいだけです。
わからなないのに何でこんなプログラムが書けなのかと思われるかもしれませんが,harmony V3というMPLABのプラグインで自動生成されたものです。

発生している問題・エラーメッセージ

../src/main.c:113:9: error: too few arguments to function 'UART1_Read'
UART1_Read();
^~~~~~~~~~
../src/main.c:42:6: note: declared here
bool UART1_Read(void *buffer, const size_t size );
^~~~~~~~~~

該当のソースコード

C言語(xc32というコンパイラー)
ソースコード
bool UART1_Read(void* buffer, const size_t size )
{
bool status = false;
uint8_t* lBuffer = (uint8_t* )buffer;

if(lBuffer != NULL) { /* Check if receive request is in progress */ if(uart1Obj.rxBusyStatus == false) { /* Clear error flags and flush out error data that may have been received when no active request was pending */ UART1_ErrorClear(); uart1Obj.rxBuffer = lBuffer; uart1Obj.rxSize = size; uart1Obj.rxProcessedSize = 0; uart1Obj.rxBusyStatus = true; uart1Obj.errors = UART_ERROR_NONE; status = true; /* Enable UART1_FAULT Interrupt */ IEC1SET = _IEC1_U1EIE_MASK; /* Enable UART1_RX Interrupt */ IEC1SET = _IEC1_U1RXIE_MASK; } } return status;

}

---------------加筆しました。-----------------

void UART1_RX_InterruptHandler (void)
{
if(uart1Obj.rxBusyStatus == true)
{
while((_U1STA_URXDA_MASK == (U1STA & _U1STA_URXDA_MASK)) && (uart1Obj.rxSize > uart1Obj.rxProcessedSize) )
{
if (( U1MODE & (_U1MODE_PDSEL0_MASK | _U1MODE_PDSEL1_MASK)) == (_U1MODE_PDSEL0_MASK | _U1MODE_PDSEL1_MASK))
{
/* 9-bit mode /
((uint16_t
)uart1Obj.rxBuffer)[uart1Obj.rxProcessedSize++] = (uint16_t )(U1RXREG);
}
else
{
/* 8-bit mode */
uart1Obj.rxBuffer[uart1Obj.rxProcessedSize++] = (uint8_t )(U1RXREG);

}
}

/* Clear UART1 RX Interrupt flag */
IFS1CLR = _IFS1_U1RXIF_MASK;

/* Check if the buffer is done */
if(uart1Obj.rxProcessedSize >= uart1Obj.rxSize)
{
uart1Obj.rxBusyStatus = false;

/* Disable the fault interrupt */
IEC1CLR = _IEC1_U1EIE_MASK;

/* Disable the receive interrupt */
IEC1CLR = _IEC1_U1RXIE_MASK;

if(uart1Obj.rxCallback != NULL)
{
uart1Obj.rxCallback(uart1Obj.rxContext);
}
}
}
else
{
// Nothing to process
;
}
}

試したこと

調べたことはconstが定数を表していること、size_tは長さを表すってことを調べて分かったくらいです。何も調べていないに等しいです。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/12/17 23:34

「そんなことも知らないのか」っていうと回答者がマウントとりにきたとか初心者いじめとか批判されるらしいですけれど、やっぱりC言語の入門書に一通り目を通すぐらいのことはしていないとCのプログラムをいじるのは無理というものなので...やっばり質問の前にやるべきことはやって欲しいと思います。 Yahoo知恵袋なら「質問があればなんでも」というスタンスのようなのでなんでも投稿しちゃえばいいのかも知れませんが、teratailは一応でも「ITエンジニア特化型Q&Aサイト」と銘打っているので、エンジニア、せめてエンジニアを目指している者という立場で質問して欲しいなぁ、と思うのですが、駄目でしょうか。
imahh

2021/12/18 07:33

プロラミング的なものは3ヶ月間前に始めて、一応苦しんで覚えるC言語を横で開きながら書いています。
guest

回答3

0

一応回答っぽくなるので追記・修正依頼からこちらに。

苦Cを読んでいるのであれば、少なくともWeb版では「関数に数値を渡す」 話は載っているので、書籍版にも関数の呼び出し方の説明はあるかと思います(私は書籍版を持っていないので...)。
関数の定義を見れば bool UART1_Read(void* buffer, const size_t size ) となっているのですから、引数はそれらを渡せばいい、ということになります。

やりたいことはただメイン関数内でこちらの関数を実行したいだけです。

揚げ足取りに聞こえてしまうかも知れませんが「関数を実行したい」のですか? 受信データを取得したい、その手段が関数を呼び出すこと(らしい)、という話では?
そうすると、受信データはどうやったら受け取れるんだろう? データは変数に入ります。そこで先程の引数。Cでは、「配列」は関数の引数ではポインタとして扱われます(「引数による情報の受け渡し」)。そして、与えた配列にデータを入れて寄越す、というのは非常によく使われる方法です。で、どれだけのデータ量を受け取りたいの? これがsize。

UART1_Readという関数名が何故か不思議にも頭に浮かんできたので書いた...なんていうことはないと思います。だとすれば、そのUART1_Readという関数名を知る過程で、そういう情報も傍らにあったりはしなかったでしょうか。

(実際のデータ取得は割り込みによるものなので、その辺の仕組みは組み込み向けではない苦Cには書かれていませんが)

投稿2021/12/18 08:13

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

あまり詳しくないですが、単純に使えばいいのでは?

単にUART1_Read関数ってのを使いたいだけですよね?
単に使えばいいのでは。

普通に考えて、UART1_Readはreadとあることから『データの読み込み』です。
で、第一引数はvoid* bufferですが、読み込みなのでおそらく『結果を格納するためのバッファ』でしょうね。
第二引数はconst size_t sizeですが、このconstは単に『関数内で値が書き変わらないことを示している』だけで、引数名からすると『バッファのサイズ』でしょうね。

つまり、

第一引数: 格納先のバッファ
第二引数: 第一引数の最大サイズ

でしょうね。

なんでこんな煩わしいことをするのでしょうか。それはバッファオーバーフローを回避するためです。

C言語の場合、文字列ですら配列です。配列ってことは要素数を指定しますよね。でももし要素数を超えて格納するとどうなるでしょうか。いわゆるバッファオーバーフローが起きます。それを回避するためにサイズを指定します。

ちなみにCLIとしてのscanf関数とかもこの現象が起きやすいです。


[追記1]

失念していましたが、epistemeさんが仰るように「指定バイト数読み込め」的な意味とも取れますね。

投稿2021/12/17 23:29

編集2021/12/18 06:11
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/12/18 06:07 編集

↑と決めつけてはいけないんじゃない? bufferが指す領域に「sizeバイトだけ読み込め」かもよ。
BeatStar

2021/12/18 06:10

@ epistemeさん 確かにそれもありそうですね…
imahh

2021/12/18 08:58 編集

あの後考えたのですが質問した関数はどうやら受信したデータを受信バッファーから取り出すための割り込み関数を起動させるための関数のようです。 なので実際に読み込んでいるのは下記の関数のようです。 void UART1_RX_InterruptHandler (void) { if(uart1Obj.rxBusyStatus == true) { while((_U1STA_URXDA_MASK == (U1STA & _U1STA_URXDA_MASK)) && (uart1Obj.rxSize > uart1Obj.rxProcessedSize) ) { if (( U1MODE & (_U1MODE_PDSEL0_MASK | _U1MODE_PDSEL1_MASK)) == (_U1MODE_PDSEL0_MASK | _U1MODE_PDSEL1_MASK)) { /* 9-bit mode */ ((uint16_t*)uart1Obj.rxBuffer)[uart1Obj.rxProcessedSize++] = (uint16_t )(U1RXREG); } else { /* 8-bit mode */ uart1Obj.rxBuffer[uart1Obj.rxProcessedSize++] = (uint8_t )(U1RXREG); } } /* Clear UART1 RX Interrupt flag */ IFS1CLR = _IFS1_U1RXIF_MASK; /* Check if the buffer is done */ if(uart1Obj.rxProcessedSize >= uart1Obj.rxSize) { uart1Obj.rxBusyStatus = false; /* Disable the fault interrupt */ IEC1CLR = _IEC1_U1EIE_MASK; /* Disable the receive interrupt */ IEC1CLR = _IEC1_U1RXIE_MASK; if(uart1Obj.rxCallback != NULL) { uart1Obj.rxCallback(uart1Obj.rxContext); } } } else { // Nothing to process ; } }
episteme

2021/12/19 00:38 編集

...それで? # そのコードから察するに「sizeバイト読み込め」が正解ポいね。
imahh

2021/12/23 12:36

ありがとうございました。
guest

0

関数の名前から、おそらく受信関数であることがわかります。
第一引数には、受信データを格納するバッファのアドレスを入れ、第2引数にはそのバッファのバイト数を入れて呼び出せばいいかと思われます。

#あくまで推測

投稿2021/12/17 23:17

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問