C 通过USB串行(WinAPI)以115200波特进行通信时发送的额外字节
我正在尝试使用原始WinAPI命令通过USB向Arduino Uno发送串行消息。当使用波特率低于115200时,它工作得非常好。但是,当我以115200波特发送时,会发送两个额外字节,作为我发送的数据的前缀,但仅用于连接到Arduino后的第一条消息。例如,如果我连接到Arduino并发送两个字节Hi,Arduino将接收ððHi。如果我再发一次Hi,Arduino就会收到它应该收到的Hi。额外字节通常为ð0xF0,但并不总是如此 我知道我的计算机和Arduino能够以115200波特的速度进行通信,因为其他程序,如avrdude和Arduino IDE的串行监视器可以很好地进行通信 我已经尝试过清除两侧的RX和TX缓冲区,也弄乱了DCB设置,但没有效果。有人知道这可能是什么原因吗 谢谢 下面是我重现问题的代码: 计算机端:C 通过USB串行(WinAPI)以115200波特进行通信时发送的额外字节,c,winapi,serial-port,arduino,usbserial,C,Winapi,Serial Port,Arduino,Usbserial,我正在尝试使用原始WinAPI命令通过USB向Arduino Uno发送串行消息。当使用波特率低于115200时,它工作得非常好。但是,当我以115200波特发送时,会发送两个额外字节,作为我发送的数据的前缀,但仅用于连接到Arduino后的第一条消息。例如,如果我连接到Arduino并发送两个字节Hi,Arduino将接收ððHi。如果我再发一次Hi,Arduino就会收到它应该收到的Hi。额外字节通常为ð0xF0,但并不总是如此 我知道我的计算机和Arduino能够以115200波特的速度进
#include <Windows.h>
int main()
{
// Open device as non-overlapped
HANDLE device = CreateFile(L"COM6",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
// Make sure the device is valid
if(device == INVALID_HANDLE_VALUE)
return 0;
DCB dcb;
if(!GetCommState(device, &dcb))
return 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fNull = 0;
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if(!SetCommState(device, &dcb))
return 0;
COMMTIMEOUTS Timeouts = { 0 };
Timeouts.ReadTotalTimeoutConstant = 1000;
Timeouts.WriteTotalTimeoutConstant = 1000;
if(!SetCommTimeouts(device, &Timeouts))
return 0;
char *buf = "abcdef";
DWORD written;
WriteFile(device, buf, 6, &written, NULL);
DWORD read;
char inbuf[100];
ReadFile(device, inbuf, 100, &read, NULL);
// When I get the result inbuf, it has 8 bytes: {0xF0, 0xF0, a, b, c, d, e, f}
// Doing a 2nd set of Write/ReadFile, with the same message, gives the correct response
return 0;
}
怀疑是19200年的传输-可能是XON 0x11?chux,我不确定你所说的怀疑是19200年的传输是什么意思。我不认为额外的位是XON,因为它们通常是0xF0。听起来像是在使用USB串行适配器-试试另一个。USB串行适配器具有众所周知的可变质量。或者在Windows计算机上尝试PCI或PCI Express串行端口。请记住,即使您在测试中找到了一个工作正常的设置,串行端口的链路上也会有噪声,特别是在启动通信时。您的协议应该尝试以某种方式处理此问题,即,当线路上有垃圾时,不要摔倒。0xF0可能是正在采样的下降沿,甚至可能是chux建议的更低数据速率的东西。开始位?CTS接线错误?相声?其他任意噪音?为什么不从等式中取一个变量,使用一个久经考验的第三方程序进行串行通信,如putty或Terterm?1 19200年发送的XON 0x11可能看起来像115200年的2 0xF0。错误字节有4个连续的on或off位这一事实就是提示。2而不是通常说ð0xF0,但不总是这样说,请提及其他错误字节是什么。连续的1和0?3调整代码以查找帧错误停止位为0和中断信号。如果您正在接收这些信号,则源信号可能处于错误的波特率。4您可以按照@Michael Burr的建议使用PCI卡进行调试。当然,您可以使用第三方软件进行调试。
void setup()
{
Serial.begin(115200);
}
void loop()
{
if(Serial.available())
Serial.write(Serial.read());
}