gpt4 book ai didi

c - linux 中的串口通信返回错误的答案

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:24 28 4
gpt4 key购买 nike

我正在尝试创建一个 linux ubuntu 程序,它将从 tty 串行端口(Windows 中的 COM 端口)读取数据。我没有使用 USB 适配器,而是实际的 COM 端口。到目前为止,这是我的通信代码:

int OpenPort(void)
{
int fd; // file description for sp

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);

if(fd == -1) // port not opened
{
printf("Error:\n%s.\n", strerror(errno));
}
else
{
fcntl(fd, F_SETFL, 0);
printf("Success.\n");
}

return(fd);
} // Open sp

void Communicate(void)
{
struct termios settings;

tcgetattr( fd, &settings );

cfsetispeed(&settings, B9600); // Set bouds
cfsetospeed(&settings, B9600);

settings.c_cflag &= ~PARENB; // set no parity, stop bits, data bits
settings.c_cflag &= ~CSTOPB;
settings.c_cflag &= ~CSIZE;
settings.c_cflag |= CS8;

tcflush( fd, TCIFLUSH );

if (tcsetattr(fd, TCSAFLUSH, &settings)!= 0)
{
printf("Error message");
}

//Create byte array
unsigned char send_bytes[] = { 0x1, 0x6, 0x2, 0xAA, 0x2, 0x3, 0xB8, 0x4 };

write(fd, send_bytes, sizeof(send_bytes)); // Send data
printf("Data sent. \n");

char buffer[64]; // buffer to receive data

printf("I'm reading data...\n");
int n = read(fd, buffer, sizeof(buffer));

if (n < 0)
printf("Failed to read\n");

int i;
printf("Showing data...\n");

for(i=0; i<sizeof(buffer); i++)
{
printf("Hex: %x\n", buffer[i]);
}

printf("Closing...\n");

close(fd);

printf("All done!\n");
}

我这里有几个问题:

  1. 在我运行程序后,它可以正确执行,但是当我尝试再次运行它时,它会停在“我正在读取数据...”,并且即使在我重新启动计算机后也不会启动。一段时间后,它允许我再次执行程序。
  2. 程序返回数据后,它应该向我发送十六进制数据,如 A7、9F 等。但这会给我整数值。
  3. 我应该以及如何清除缓冲区数组以释放内存

任何人都可以帮助解决这些问题吗?

最佳答案

'int n = read(fd, buffer, sizeof(buffer));'返回读入 n 的字节数,然后忽略它(除了检查负错误值),并假设缓冲区已完全填满。这是一个错误,因为 recv() 通常不会等待请求的字节数,因为串行端口提供的是字节流,而不是“缓冲区”或“消息”。

printf("十六进制: %x\n", 缓冲区[i]);将显示整数,因为您使用 %x 指定了整数。仔细查看 printf 格式代码。

关于c - linux 中的串口通信返回错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038484/

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