我想根据以下指南将十六进制字节数组写入串行端口,以与板进行通信。
我的尝试:
if((fd = serialOpen ("/dev/ttyS0", 115200)) < 0 {
return;
}
unsigned char command[6] = {0x3E,0x52,0x01,0x53,0x01,0x01};
write(fd,command,6);
sleep(1);
我的工作有什么问题吗?
答案 0 :(得分:1)
是的,这有问题。
serialOpen()
如果操作失败,则返回-1,并将errno
设置为指示错误。
确保在程序开始时包含<stdlib.h>
,<stdio.h>
,<string.h>
,<errno.h>
和<wiringSerial.h>
,然后使用例如
int fd;
fd = serialOpen("/dev/ttyS0", 115200);
if (fd == -1) {
fprintf(stderr, "Cannot open /dev/ttyS0: %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
write()
可能返回一个短计数。您不能仅仅假设它成功发送了所有信息。我建议您使用辅助功能,例如
#ifdef __cplusplus
extern "C" {
#endif
int writeall(const int fd, const void *data, const size_t len)
{
const char *ptr = (const char *)data;
const char *const end = (const char *)data + len;
ssize_t n;
while (ptr < end) {
n = write(fd, ptr, (size_t)(end - ptr));
if (n > 0)
ptr += n;
else
if (n != -1)
return errno = EIO;
else
if (errno != EINTR)
return errno;
}
return 0;
}
#ifdef __cplusplus
}
#endif
,成功返回0,错误返回非零。您可以这样使用它:
if (writeall(fd, "\x3E\x52\x01\x53\x01\x01", 6)) {
fprintf(stderr, "Serial write error: %s.\n", strerror(errno));
/* If this is fatal, do exit(EXIT_FAILURE) here.
If the error is not a fatal one, let the program continue.
*/
}
请勿执行sleep()
。至少,请确保您包括<termios.h>
,并
tcdrain(fd);
确保内核发送所有串行数据;仅在到目前为止写入fd
的所有内容(fd
打开了串行端口或tty)之后,它才会返回。
此外,我建议不要使用serialPutchar()
,serialPuts()
,serialPrintf()
和serialGetchar()
,因为they do not have any kind of error checking。