c - 树莓派,与串口设备通信

标签 c raspberry-pi usbserial

我尝试从 Raspberry pi 与串行设备进行通信,但没有成功。

我连接、写入数据但从未读回数据。

串行设备在 Windows 中工作正常,在 com 端口上进行以下设置 - 波特率:9600,奇偶校验:无,位:8,停止位:1

对于通信,我使用 USB 转串行 FTDI 适配器。

我的工作c代码是:

int set_interface_attribs(int serialPort)
{
  struct termios tty;
  if (tcgetattr(serialPort, &tty) < 0) {
    printf("Error from tcgetattr: %s\n", strerror(errno));
    return -1;
  }
  printf("Old Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
  int speed = B9600;
  cfsetospeed(&tty, (speed_t)speed);
  cfsetispeed(&tty, (speed_t)speed);
  tty.c_cflag = CS8 |  CLOCAL | CREAD;
  tty.c_iflag = IGNPAR;
  tty.c_oflag = 0;
  tty.c_lflag = 0;
  tcflush(serialPort, TCIFLUSH);
  if (tcsetattr(serialPort, TCSANOW, &tty) != 0) {
    printf("Error from tcsetattr: %s\n", strerror(errno));
    return -1;
  }
  printf("New Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
  return 0;
}

int main( int argc, char *argv[] ) {
  printf("Start program\n");
  int serialPort=0;
  //if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
  if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY))<0) {
    printf("Error opening port: %s\n", strerror(errno));
    return 1;
  }
  set_interface_attribs(serialPort);
  long n;
  char strSend[20];
  sprintf(strSend,"98000001%c%c", 0x0D,0x0A);
   if ((n = write(serialPort, strSend, strlen(strSend)) ) < 0 ){
    perror("Error write to serialPort");
    return 0;
  }
  printf("Write (%d) chars (%s) to serialPort\n", (int)n, strSend);
  sleep(1);
  printf("Start reading from serialPort\n");
  char wData[20];
  memset(wData, '\0', sizeof(wData));
  if ( (n = read(serialPort, wData, 20) ) <= 0 ){
    printf("Error %d read from serialPort\n", (int)n);
  } else{
    wData[n] = 0;
    printf("Read:%d, %s\n", (int)n, wData);
  }
  printf("Close serialPort\n");
  close(serialPort);
  return 0;
}

输出是:

Start program
Old Serial port flags, i:4, o:0, c:2224
New Serial port flags, i:4, o:0, c:2224
Write (10) chars (98000001
) to serialPort
Start reading from serialPort
Error 0 read from serialPort
Close serialPort

任何想法或建议;

最佳答案

读取应该与写入同时进行。

你应该做一个无限循环。该 bucle 应该始终读取端口。 建议将缓冲区制作成线程(可以使用lpthread.h)。

生命周期:

  • 配置串口
  • 打开串口
  • 创建线程来读取
  • 编写(以测试它)
  • 关闭串口。

另一方面,最好的选择(如果您想测试您的代码)是在 RX 和 TX 引脚上制作跳线。

因此,您所写的所有内容都将能够阅读。

关于c - 树莓派,与串口设备通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40915157/

相关文章:

python - 流媒体录制程序VLC

c - 函数返回一个没有相关参数的条件函数

c++ - 创建一个程序以在 openWRT 上运行它入门

vb.net - 使用串口转 USB 开关控制程序

c - 在 C 语言中使用 getchar

python - 如何在 Raspberry Pi 上使用 TBB 构建 OpenCV?

python - 当 Python 子进程获取数据时,Raspberry Pi 上 LCD 上每行末尾的字符错误

serial-port - 使用 zmodem/picocom/minicom 非交互传输文件

c# - PC 和 USB 设备之间通信的最佳方式是什么

无法弄清楚为什么 getchar() 在 C 中第一次出现时选择换行符