gpt4 book ai didi

c - 使用串口时收到额外的空字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:58 25 4
gpt4 key购买 nike

我在linux上写一个串口数据传输程序,发现发送方每次打开端口,接收方都会多出一个空字节'\x00'

这是发件人的代码:

#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int main(int argc, char* argv[]) {
int fd_com_ = open("/dev/ttyAM0", O_RDWR | O_NOCTTY | O_NONBLOCK);

struct termios attrs_;
attrs_.c_iflag = IGNBRK;
attrs_.c_oflag = 0;
attrs_.c_cflag = (CLOCAL | CREAD);
attrs_.c_cflag |= CS8;
attrs_.c_lflag = 0;
attrs_.c_cc[VMIN] = 0;
attrs_.c_cc[VTIME] = 0;
cfsetspeed(&attrs_, B115200);

tcsetattr(fd_com_, TCSANOW, &attrs_);

const char *s = "abcd";
write(fd_com_, s, 4);
sleep(1);
write(fd_com_, s, 4);
sleep(1);
close(fd_com_);

fd_com_ = open("/dev/ttyAM0", O_RDWR | O_NOCTTY | O_NONBLOCK);
write(fd_com_, s, 4);

return 0;
}

接收器具有相同的配置,但接收到"\x00abcdabcd\x00abcd"。如何解决此问题以便接收方可以得到 "abcdabcdabcd"


更新:

接收方代码:

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int main(int argc, char* argv[]) {
int fd_com_ = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);

struct termios attrs_;
attrs_.c_iflag = IGNBRK;
attrs_.c_oflag = 0;
attrs_.c_cflag = (CLOCAL | CREAD);
attrs_.c_cflag |= CS8;
attrs_.c_lflag = 0;
attrs_.c_cc[VMIN] = 0;
attrs_.c_cc[VTIME] = 0;
cfsetspeed(&attrs_, B115200);

tcsetattr(fd_com_, TCSANOW, &attrs_);

char buf[100];
ssize_t sz;
while(1) {
sz = read(fd_com_, buf, 100);
if (sz > 0) {
for (ssize_t i=0; i<sz; i++) {
printf("%02hhx\n", buf[i]);
}
}
sleep(1);
}

return 0;
}

最佳答案

请查看您的 ARM 板的文档,了解 ARM 的 UART 是如何连接的,以及它是如何在硬件和您的平台驱动程序中配置的。

根据您的描述,我假设当打开 ARM 上的 UART 端口时,物理 UART(即 ARM 中的硬件外围模块或可能是外部有线 UART 芯片)被启用或从某个未知空闲状态恢复状态到 RS232 的正确 -12 伏空闲状态。此转换可能足以让您的 PC 的 UART 识别起始位并接收伪造字符。

您可能想使用示波器检查串行线路,以查看实际打开端口时发生的情况。

关于c - 使用串口时收到额外的空字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27470932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com