C串行通信。 WriteFile成功,但是我的设备仅处理第一个字符

问题描述 投票:0回答:2

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

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

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

但是,如果我尝试发送“ ver \ r”,则设备收到第一个字符“ v”后,就会以“找不到命令”来响应。如果使用TeraTerm并键入“ ver \ r”,我会收到回传的版本号(键入“ v”后,不会立即收到“找不到命令”)。注意我可以从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)
 }      
c windows serial-port writefile
2个回答
0
投票

初始化数组


0
投票

确定,我终于可以正常工作了。如前所述,发送整个字符串(使用WriteFile)不起作用。但是,一次发送每个字符(使用WriteFile),每个字符之间有1秒的延迟确实起作用了!我将尝试以比1秒更短的延迟进行尝试,但是无论如何,我认为因此设备处理发送给它的数据非常慢?

© www.soinside.com 2019 - 2024. All rights reserved.