c - 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)
}
解决方案
好的,我终于让它工作了。正如我所解释的那样,发送整个字符串(使用 WriteFile)不起作用。但是,一次发送一个字符(使用 WriteFile),每个字符之间有 1 秒的延迟确实有效!我将尝试使用比 1 秒更短的延迟,但无论如何,我认为设备处理发送给它的数据的速度非常慢?
推荐阅读
- javascript - 如何在条件 if-else 语句上执行函数?
- db2 - DB2 中的 unicode 字符 $(0) 是什么?
- android - 转换 Android Studio 项目新 API 密钥时遇到问题
- javascript - 将对象映射到数组
- .net - 使用带有 BountyCastle .NET 的 AES256 解密失败并显示“mac check in GCM failed”
- python - 从给定 4 个点坐标的图像中提取任意矩形块
- java - 在设置变量之前检查 null - 没有 if-else
- node.js - 部署后如何在 Azure 上修复“找不到模块 ../”
- cucumber - 如何在 Cucumber 的参数类型中设置布尔值?
- join - Yii2:如何做三张表的内连接?