シリアルポートからバッファに読み込みを行うCコードがあり、100バイトを読み込んだときに関数log_write()
を使用してそれらを書き込みます。 一部のデータが欠落しているため、未定義の動作が発生していると思います。明らかにコードに間違いはありますか?シリアルポートからc - 配列インデックスの問題を読む
具体的には、以下の行に1を追加する必要がありますか?rdlentotal
?以前の読み込みの最後の文字を上書きしていますか?
また、読み込まれた最後の文字の後にバッファを終了する必要がありますか?どうすればいい? Chuxから
rdlen = read(fd_joule, &ibuf[rdlentotal], sizeof(ibuf)); rdlentotal += rdlen; /*keep track of total bytes read*/
int rdlen=0, rdlentotal = 0;
char ibuf[1024];
memset(&ibuf[0], 0, sizeof(ibuf)); /*clear the buffer*/
while (1) {
/*read from serial port*/
rdlen = read(fd_joule, &ibuf[rdlentotal], sizeof(ibuf));
rdlentotal += rdlen; /*keep track of total bytes read*/
if (rdlentotal > 100) { /*when you have 200 bytes write the websocket*/
log_write("%s", &ibuf); /*write to websocket*/
memset(&ibuf[0], 0, sizeof(ibuf)); /*clear buffer*/
rdlentotal = 0; /*rest byte counter */
rdlen = 0;
}
if (rdlen < 0) {
fprintf(stderr, "rdlen les than 0\r\n");
}
}
更新されたコードの提案:log_write()
ため
static void *serial_logging_thread() {
ssize_t rdlen = 0, rdlentotal = 0;
char ibuf[1024 + 1];
memset(&ibuf[0], 0, sizeof(ibuf)); /*clear the buffer*/
while (1) {
/*read from serial port write to log file*/
rdlen = read(fd_joule, &ibuf[rdlentotal], sizeof(ibuf) - 1 - rdlentotal);
rdlentotal += rdlen;
if (rdlentotal > 200) { /*when you have 200 bytes write to file and websocket*/
ibuf[rdlentotal + 1] = '\0'; /*null terminate*/
log_write("%s", &ibuf); /*write to websocket*/
memset(&ibuf[0], 0, sizeof(ibuf)); /*clear buffer*/
rdlentotal = 0; /*rest byte counter */
rdlen = 0;
}
if (rdlen < 0) {
LOG("error reading serial port, rdlen less than 0\r\n");
}
}
}
宣言。
int log_write(const char *fmt, ... /* arguments */){
'読み出す(fd_joule、&IBUFは[rdlentotal]、はsizeof(IBUF));' - > '読み出す(fd_joule、&IBUFは[rdlentotal]、はsizeof(IBUF) - rdlentotal);' – chux
教えます私たちにお願いします - バイトストリームにはNULが入っていますか?もしそうなら、あなたはすでに壊れている、下のchuxのヒント。 –
samsung gathering:あなたの質問に回答のコピーを追加するのではなく、1)[私の質問に誰かが答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers)2)ロールバック前のバージョンへのあなたの質問。 – chux