c – linux和windows之间的串行通信
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – linux和windows之间的串行通信,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2868字,纯文字阅读大概需要5分钟。
内容图文
![c – linux和windows之间的串行通信](/upload/InfoBanner/zyjiaocheng/955/baacdce3b20f48cea0d2459689ec2e37.jpg)
我将数据字节从linux发送到串口RS232的窗口,然后一切正常,只有我必须处理从linux发送的0xa,因为Windows将其读取为0xd 0xa.
但是当我从windows发送数据字节到linux时,一些字节被替换为 –
windows发送 – 0xd linux接收0xa
windows发送 – 0x11 linux接收整数8200的垃圾tyte值
请解释当我将数据从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字节块中的200 KB文件,以便在从Windows发送到Linux时可以替换哪个字节
解决方法:
如果您在Windows上使用ReadFile和WrietFile并在Linux中进行读写操作,那么除了“您必须在收到它之后必须在某个时刻进行翻译”之外,它应该无关紧要.
这看起来不正确:
while(read(_fd_port_no,buffer+_buffer_len,sizeof(buffer))>0)
{
_buffer_len = _buffer_len+sizeof(buffer);
}
您应该考虑read返回的读取大小.
如果sizeof(缓冲区)是您正在读入的实际缓冲区,则添加_buffer_len,当_buffer_len> = sizeof(缓冲区)将在缓冲区外写入??.
也有点担心这个:
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之间的串行通信全部内容,希望文章能够帮你解决c – linux和windows之间的串行通信所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。