c - BeagleBone 黑色 : UART crashes the BBB after two successful read write calls

标签 c beagleboneblack uart

我在使 UART 与 BBB 保持一致时遇到一些问题。我已按 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]);

    }

最佳答案

通过更改为 VMIN=2 以匹配我期望每个读取命令的数据量,问题得到了解决。阅读此页非常有帮助。我认为将 VMIN 设置为高并不是问题,因为即使字节数低于旧的 VMIN 值,我仍然在获取前两个命​​令,但是现在考虑到“我们认为如果 nbytes 是未定义的行为”,那么这是有道理的小于 VMIN。”非常感谢您的帮助!

关于c - BeagleBone 黑色 : UART crashes the BBB after two successful read write calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35928907/

相关文章:

c++ - 与特定 GLIBC 版本的链接

c - MicroChip dsPic33,UART RX 中断未被调用

c - 与 0 进行比较与与值进行比较是否更快?

C无法判断if语句

c - 如何在ubuntu上编译doom?

c - 为什么 printf 不能编译?

opencv - 构建opencv时,找不到文件 "cv2.so"

c++ - Angstrom Linux 上 BeagleBone Black 的 GPIO/模拟编程,在 Windows 上交叉开发的编译器是什么?

C语言连接两个串口

c - 停止字符串数组