我在使用BBB获得一致的UART时遇到了一些麻烦。对于非规范输入,我已按照this page所示进行了设置。即使在第三个周期,我似乎能够传输得很好。这是读取命令似乎让我。我甚至不确定从哪里开始,所以任何指针都将非常感谢!这是我正在使用的代码:
编辑:为了特异性
当我说两个读写调用时,我的意思是我的循环按预期执行两次。我发出数据并准确读出我的预期。在第三次尝试阅读时,在“写入数据...”printf执行之后,程序崩溃了。我仍然可以像往常一样按CTRL-C运行BBB,重启程序会让我在出现同样问题之前再次读取和写入两次。
对于while循环条件,我意外忘记在下面看到的代码中添加read_test变量的初始化。我正在将这个串行通信添加到一个更大的程序中,控制我研究的机器人。我相信我已经捕获了所有相关的代码,这个测试是在我初始化我需要的所有变量后发生的第一件事,但是如果整个文件都有用,我可以添加它。
void SERIAL_Init(void)
{
/*******************************************************************/
printf("\tSerial Port Initialization ...");
SERIAL_fd = open(MODEMDEVICE,O_RDWR | O_NOCTTY /*| O_NDELAY*/);
if (SERIAL_fd < 0)
{ perror(MODEMDEVICE);
exit(-1);
}
fcntl(SERIAL_fd,F_SETFL,0);
tcgetattr(SERIAL_fd,&newtio);
newtio.c_cflag |= CS8 | CLOCAL | CREAD ;
cfsetispeed(&newtio,BAUDRATE);
cfsetospeed(&newtio,BAUDRATE);
newtio.c_iflag = IGNBRK | IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME]=0; /* inter-character timer unused */
newtio.c_cc[VMIN]=31; /* blocking read until 18 chars received */
tcflush(SERIAL_fd,TCIFLUSH);
tcsetattr(SERIAL_fd,TCSANOW,&newtio);
/****************************************************************/
printf("Done\n");
return;
}
//Test data for reading serial
unsigned char test_data[2] = {0x00,0x00};
//Read from maestro command
unsigned char read_command[2][2] = {
{0x1a,0x2b},
{0x90,0x05},
};
while(readTest == 0)
{
printf("Enter 0 to read from maestro pin, 1 to continue with testing\n");
scanf("%d",&readTest);
write(SERIAL_fd,read_command[0],2);
printf("Wrote values...\n");
num_bytes = read(SERIAL_fd,&test_data,2);
printf("Value read: %x %x\n",test_data[0],test_data[1]);
}
答案 0 :(得分:0)
通过更改为VMIN = 2来解决问题,以匹配每个读取命令所期望的数据量。阅读本页非常有帮助。我认为将VMIN设置为高并不是问题,因为即使字节数低于旧的VMIN值,我仍然需要前两个命令,但是现在这有意义了#34;我们相信如果nbytes小于VMIN,则表示未定义的行为。&#34;非常感谢你的帮助!