gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:10:14 25 4
gpt4 key购买 nike

我正在尝试与插入我的 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)
}

最佳答案

初始化数组

 char command[4] = {"v", "e", "r", "\r"};

应该至少产生一个警告。您没有将字符分配给 command 的元素。将其更改为

 char command[4] = {'v', 'e', 'r', '\r'};

甚至更好

char command[] = "ver\r";

在第二种情况下,您需要调用strlen来获取字符数。 command 将多保留一个字符,'\0'

顺便说一句,在没有字符串结尾标记的字符数组上调用 strlen() 会引发未定义的行为。你应该写的是

g_count = sizeof command;

关于C 串行通信。 WriteFile 成功,但我的设备仅处理第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com