首页 > 解决方案 > C 串行通信。WriteFile 成功,但我的设备只处理第一个字符

问题描述

我正在尝试与插入 PC 上的 USB 端口的硬件设备实现串行通信。我使用 Visual Studio 2015 用 C 语言编写通信代码。

我正在使用 USB 嗅探器来帮助查看正在向设备发送和从设备发送哪些数据。我也在使用 TeraTerm 串行应用程序进行测试。

我正在使用我的 C-code 将 OK 连接到设备。但是,我在将数据写入设备时遇到问题。我可以写一个字符,例如“\r”,设备将通过发回“找不到命令”做出适当的响应。我可以使用 USB 嗅探器看到这一点。

但是,如果我尝试发送“ver\r”,那么一旦设备接收到第一个字符“v”,它就会以“找不到命令”进行响应。如果使用 TeraTerm 并输入“ver\r”,我会收到一个发回的版本号(我不会在输入“v”后立即收到“command not found”)。注意我可以从 USB 嗅探器程序中看到 4 个字节“ver\r”被发送到设备。我还使用从 WriteFile 命令返回的“字节数”值检查了这一点。

因此,由于某种原因,设备会在收到的第一个字符上起作用。使用 TeraTerm 应用程序一切正常,所以我只能认为我在软件中做错了什么,也许真的很明显。然而,我在这上面花了很长时间,一切看起来都很好。我让事情变得简单,并且我对另一台几乎第一次工作的设备的串行通信有一些经验。所以我不知道为什么设备在收到的第一个字符上起作用?

int count = 0;
char vPortName[20];

sprintf((char*)vPortName, "%s%s", "\\\\.\\", comPort);

g_thePort = CreateFileA(vPortName,
                        GENERIC_READ | GENERIC_WRITE, 
                        0, 
                        NULL, 
                        OPEN_EXISTING, 
                        0,
                        NULL);



DCB dcbSerialParams = { 0 };
g_result = OK;

dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(g_thePort, &dcbSerialParams))
    g_result = ERR_GETCOMMSTATE;

if (g_result == OK)
{
    dcbSerialParams.BaudRate = CBR_115200;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
}

if (g_result == OK)
{
    if (!SetCommState(g_thePort, &dcbSerialParams))
        g_result = ERR_SETCOMMSTATE;
}

if (g_result == OK)
{
    COMMTIMEOUTS timeouts = { 0 };

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    if (!SetCommTimeouts(g_thePort, &timeouts))
        g_result = ERR_SETTIMEOUTS;
}

if(g_result == OK)
{
        char command[4] = {"v", "e", "r", "\r"};
    DWORD numbytes = 0;

    PurgeComm(g_thePort, PURGE_RXCLEAR | PURGE_TXCLEAR);

    g_count = strlen(command);

    WriteFile(g_thePort, command, g_count, &numbytes, NULL)
 }      

标签: cwindowsserial-portwritefile

解决方案


好的,我终于让它工作了。正如我所解释的那样,发送整个字符串(使用 WriteFile)不起作用。但是,一次发送一个字符(使用 WriteFile),每个字符之间有 1 秒的延迟确实有效!我将尝试使用比 1 秒更短的延迟,但无论如何,我认为设备处理发送给它的数据的速度非常慢?


推荐阅读