C 通过USB串行(WinAPI)以115200波特进行通信时发送的额外字节

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波特的速度进

我正在尝试使用原始WinAPI命令通过USB向Arduino Uno发送串行消息。当使用波特率低于115200时,它工作得非常好。但是,当我以115200波特发送时,会发送两个额外字节,作为我发送的数据的前缀,但仅用于连接到Arduino后的第一条消息。例如,如果我连接到Arduino并发送两个字节Hi,Arduino将接收ððHi。如果我再发一次Hi,Arduino就会收到它应该收到的Hi。额外字节通常为ð0xF0,但并不总是如此

我知道我的计算机和Arduino能够以115200波特的速度进行通信,因为其他程序,如avrdude和Arduino IDE的串行监视器可以很好地进行通信

我已经尝试过清除两侧的RX和TX缓冲区,也弄乱了DCB设置,但没有效果。有人知道这可能是什么原因吗

谢谢

下面是我重现问题的代码:

计算机端:

#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());
}