我有a system运行Linux,将rx连接到来自UART1的tx(环回)并执行此代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main(void) {
int iFd = open("/dev/ttyTHS0", O_RDWR);
if (iFd < 0) {
fprintf(stdout, "Error when opening file.\n");
return -1;
}
while (1) {
if (write(iFd, "A", strlen("A")) == -1) {
fprintf(stdout, "Failed to write\n");
return -1;
}
char buff[10] = {
0
};
if (read(iFd, buff, sizeof(buff)) < 0) {
fprintf(stdout, "Failed to read.\n");
return -1;
}
fprintf(stdout, "read: %s\n", buff);
}
close(iFd);
return 0;
}
事情是它似乎没有收到任何数据。代码只是阻塞在read
。当用示波器观察时,我可以看到在tx线上传输的数据,但是rx没有收到任何信息。我也尝试在2个进程中拆分此代码,一个进程用于传输,另一个用于接收,但这也不起作用。
这是合乎逻辑的。您可能不会发送任何内容,因为它位于发送缓冲区中。其他问题是您尝试接收10个字节,但只发送一个。在许多系统上,串行超时设置为不定时,您将永远等待接下来的9个字节。
怎么做(第2点有一些变种):
2A。只读取发送ioctl(ifd, FIONREAD, &bytes_ready_to_read);
的字节数,然后只读取可用的数字。
2C。更改超时。