【问题标题】:Binary byte mistaken with newline in Linux serial comunication [duplicate]Linux串行通信中的二进制字节与新行错误[重复]
【发布时间】:2016-09-19 15:31:43
【问题描述】:

我正在使用串行通信接口;运行 Linux Kernel 2.6.36 的 SBC (TS-7200) 通过 RS232 将数据发送到 PC(运行 Windows)。数据被封装在数据包中(每个字节的字节)并发送。当 TS 尝试发送整数 (uint8_t)(10) 时会出现此问题,尤其是 \n 的 ASCII,终止字符 (0xA);不是随机的吧?!

奇怪的是,如果我用一个Arduino Uno做同样的精确操作,一个整数10的发送和接收都没有问题!所以我的结论是,Linux 像 \n 一样采用0b00001010,刷新串行缓冲区并且不发送 10,而 Arduino 没有。在网上搜索我发现可以在二进制模式(O_BINARY)或文件模式打开文件,但显然这在Linux中不可用;是对的吗?有没有办法让 Linux 表现得像 Arduino?

谢谢你, 费德里科

PS:我忘了说我正在使用 C

【问题讨论】:

  • 如何发送一个带值的整数,比如1000
  • 在 Linux 上你不需要O_BINARY,因为就像几乎所有正常的操作系统一样,它不会对行尾字符进行任何转换。只有 Windows 具有奇怪的 CR+LF 行结尾,您需要 O_BINARY
  • 我打开串行通信:COM2 = open("/dev/ttyAM1", O_RDWR | O_NONBLOCK); 并写我使用bytes_writed=write(COM2, number, 1);
  • @WeatherVane 我已经看过那篇文章,但我会说 Windows 对应的工作正常(LabVIEW 默认情况下会这样做,我猜(?)),否则你会如何解释它与 Arduino 一起工作而不是 TS?

标签: c linux binary serial-port


【解决方案1】:

您必须将串口设置为“原始”模式:

struct termios  tty;
unsigned int    sfd;

/* Open the serial port */
sfd = open("/dev/ttyS1", O_RDWR | O_NOCTTY);

/* Get current port config. */
tcgetattr(sfd, &tty);

/* Set youd speed/parity, etc. */
/* ... */

/*
Set raw mode, equivalent to:
tty->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
            | INLCR | IGNCR | ICRNL | IXON);
tty->c_oflag &= ~OPOST;
tty->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
tty->c_cflag &= ~(CSIZE | PARENB);
tty->c_cflag |= CS8;
*/
cfmakeraw(&tty);

tcsetattr(sfd, TCSANOW, &tty);

/* Do read/write */

请注意停用软件流控制 (XON/XOFF),以便发送数据包中的所有数据。

请查看文章How to read a binary data over serial terminal in C program?

【讨论】:

  • @PaulR 您确实意识到“链接”是一个 SO 答案?
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2014-03-23
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多