gpt4 book ai didi

c++ - linux和windows串口通信

转载 作者:可可西里 更新时间:2023-11-01 14:45:07 25 4
gpt4 key购买 nike

我正在通过串行 RS232 将数据字节从 linux 发送到 windows 然后一切正常,只有我必须处理从 linux 发送的 0xa,因为 windows 将它读取为 0xd + 0xa。但是当我将数据字节从 Windows 发送到 Linux 时,一些字节被替换为 - windows 发送 - 0xd linux 接收 0xawindows 发送 - 0x11 linux 接收整数垃圾类型值 8200

请解释当我将数据从 Windows 发送到 Linux 时出了什么问题。提前致谢

Windows串口初始化

char *pcCommPort = "COM1";
hCom = CreateFile( TEXT("COM1"),
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
fSuccess = GetCommState(hCom, &dcb);
FillMemory(&dcb, sizeof(dcb),0);


dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = CBR_115200; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
dcb.fOutxCtsFlow = false;

fSuccess = SetCommState(hCom, &dcb);
buff_success = SetupComm(hCom, 1024, 1024);
COMMTIMEOUTS cmt;
// ReadIntervalTimeout in ms
cmt.ReadIntervalTimeout = 1000;
cmt.ReadTotalTimeoutMultiplier = 1000;
cmt.ReadTotalTimeoutConstant=1000;
timeout_flag = SetCommTimeouts(hCom, &cmt);

windows 写串口-

WriteFile(hCom, buffer, len, &write, NULL);

Linux 串行初始化-

_fd_port_no = open("//dev//ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
tcgetattr(_fd_port_no, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= (CS8);
options.c_cflag|=(CLOCAL|CREAD);
options.c_cflag &=~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag |= (IXON | IXOFF | IXANY);
options.c_cflag &= ~ CRTSCTS;
tcsetattr(_fd_port_no, TCSANOW, &options);

读串口linux-

while(read(_fd_port_no,buffer+_buffer_len,sizeof(buffer))>0)
{
_buffer_len = _buffer_len+sizeof(buffer);

}

是的,正如我所说,从 Linux 到 Windows 只检测到 NL/CR 问题,但我通过字节替换解决了它,但是你知道从 Windows 发送到 Linux 的 serila 数据吗(字节替换策略)。实际上我必须通过串行发送 200 字节 block 中的 200 KB 文件,这样如果从 Windows 发送到 Linux,哪个字节可以被替换

最佳答案

如果您在 Windows 上使用 ReadFileWrietFile,在 Linux 上使用 readwrite,它应该行尾是什么真的很重要,除了“你必须在收到它后的某个时候翻译它。

这看起来不对:

while(read(_fd_port_no,buffer+_buffer_len,sizeof(buffer))>0)
{
_buffer_len = _buffer_len+sizeof(buffer);

}

您应该考虑 read 返回的读取大小。

如果 sizeof(buffer) 是您正在读入的实际缓冲区,则添加 +_buffer_len,当 _buffer_len >= sizeof(buffer) 将写入缓冲区外。

也有点担心这个:

    options.c_iflag |= (IXON | IXOFF | IXANY);
options.c_cflag &= ~ CRTSCTS;

您确定要使用 XOFF/CTRL-S (0x13) 来停止流吗?通常这意味着不允许包含 CTRL-S 的数据 - 这在发送文本数据时可能不是问题,但如果您需要发送二进制数据,那肯定会。 IXOFF 还意味着另一端必须响应 XOFF 和 XON (CTRL-Q, 0x11) 以停止/启动数据流。通常,我们不希望在现代系统中出现这种情况……

如果两端接线正确,使用 RTS/CTS 应该是安全的。

关于c++ - linux和windows串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627807/

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