【发布时间】:2017-11-30 15:45:37
【问题描述】:
我有一些 c 代码从串行端口连续读取到缓冲区,当它读取 100 个字节时,它使用函数log_write() 通过 websocket 将它们写入。
一些数据丢失了,所以我认为我得到了未定义的行为。代码有什么明显的问题吗?
特别是在下面的行中,我应该将 1 添加到 rdlentotal 吗?是否覆盖了上次读取的最后一个字符?
我还应该在读取最后一个字符后终止缓冲区吗?我该怎么做?
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");
}
}
来自 Chux 的更新代码建议:
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");
}
}
}
log_write() 的声明。
int log_write(const char *fmt, ... /* arguments */){
【问题讨论】:
-
read(fd_joule, &ibuf[rdlentotal], sizeof(ibuf));-->read(fd_joule, &ibuf[rdlentotal], sizeof(ibuf) - rdlentotal); -
请告诉我们 - 字节流中可以包含 NUL 吗?如果是这样,你已经崩溃了,正如下面 chux 所暗示的那样。
-
samsung gather:1) 复查What should I do when someone answers my question? 2) 将问题回滚到以前的版本,而不是为您的问题添加答案副本。
标签: c arrays serial-port