C++ 串口发送数据,连续2次发送必须相隔10s以上。否则发送数据设备无反应?请问代码错在哪里?

老家在JJX 2019-01-22 04:37:33
bool MyProt::OpenProt(CString ProtSel, CString BaudRate, CString DataBit, CString CheckDigit, CString StopBit)
{
//打开端口
m_hProtHandle = CreateFile(ProtSel,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
FILE_FLAG_OVERLAPPED,
NULL
);

if (INVALID_HANDLE_VALUE == m_hProtHandle)
{
DWORD err = GetLastError();
AfxMessageBox(_T("CreateFile Fail "));
return false;
}
else
{
//串口配置
SetupComm(m_hProtHandle, 1024, 1024);//输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts; //设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 3;
TimeOuts.WriteTotalTimeoutConstant = 2;
SetCommTimeouts(m_hProtHandle, &TimeOuts); //设置超时

DCB dcb;
GetCommState(m_hProtHandle, &dcb);
//波特率选择
switch (_ttoi(BaudRate))
{
case 9600:
dcb.BaudRate = 9600; //波特率为9600
break;
case 19200:
dcb.BaudRate = 19200; //波特率为9600
break;
case 38400:
dcb.BaudRate = 38400; //波特率为9600
break;
case 57600:
dcb.BaudRate = 57600; //波特率为9600
break;
case 115200:
dcb.BaudRate = 115200; //波特率为9600
break;
}

//数据位选择
switch (_ttoi(DataBit))
{
case 5:
dcb.ByteSize = 5; //每个字节有8位
break;
case 6:
dcb.ByteSize = 6; //每个字节有8位
break;
case 7:
dcb.ByteSize = 7; //每个字节有8位
break;
case 8:
dcb.ByteSize = 8; //每个字节有8位
break;
}
//奇偶校验位
if (_T("无") == CheckDigit)
{
dcb.Parity = NOPARITY; //无奇偶校验位
}
else if (_T("奇") == CheckDigit)
{
dcb.Parity = ODDPARITY; //无奇偶校验位
}
else if (_T("偶") == CheckDigit)
{
dcb.Parity = EVENPARITY; //无奇偶校验位
}
//停止位
switch (_ttoi(StopBit))
{
case 0:
dcb.StopBits = ONESTOPBIT; //0个停止位
break;
case 1:
dcb.StopBits = ONE5STOPBITS; //1个停止位
break;
case 2:
dcb.StopBits = TWOSTOPBITS; //2个停止位
break;
}
if (!SetCommState(m_hProtHandle, &dcb))
{
AfxMessageBox(_T("串口配置失败"));
return false;
}
PurgeComm(m_hProtHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
}
return true;
}

//写串口
void MyProt::WriteProt(CString str)
{

char *pchar = new char[1024];
pchar = Cst2Cchar(str, pchar);
DWORD dwBytesWritten = 1024;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osWrite;
BOOL bWriteStat;
memset(&m_osWrite, 0, sizeof(OVERLAPPED));//初始化均为0
PurgeComm(m_hProtHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);//函数清空缓冲区
bWriteStat = WriteFile(m_hProtHandle, pchar, dwBytesWritten, &dwBytesWritten, &m_osWrite);
if (!bWriteStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent, 1000);
}
}
delete[]pchar;
pchar = NULL;
}



char* MyProt::Cst2Cchar(CString str, char* pchar)
{
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
//以字节为单位
char * pFileName = new char[len + 1];
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength() + 1, pFileName, len + 1, NULL, NULL);
//多字节字符以'\0'结束
pFileName[len] = '\0';
//内存复制
memcpy(pchar, pFileName, len + 1);
//删除内存
delete[]pFileName;
pFileName = NULL;

return pchar;
}
...全文
991 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
_肆 2019-02-01
  • 打赏
  • 举报
回复
虚拟串口这个东西,会误导一些人,比如说两边配置不一样,收发的数也是正常的;当接到实体串口时,发送这句代码是拥塞的,没发完代码就堵在这,要不你把超时设置什么的代码都注释掉,就用它默认配置,试试
xueyu人生 2019-02-01
  • 打赏
  • 举报
回复
我刚写了com通信,你可以参考下:https://blog.csdn.net/zaokang5603/article/details/86736248
老家在JJX 2019-01-29
  • 打赏
  • 举报
回复
引用 8 楼 lianshaohua 的回复:
初步分析:配置问题,或设备响应能力的问题
不是,真不是。我已改正。是参数配置。有问题
ztenv 版主 2019-01-28
  • 打赏
  • 举报
回复
初步分析:配置问题,或设备响应能力的问题
老家在JJX 2019-01-27
  • 打赏
  • 举报
回复
引用 6 楼 CT8100 的回复:
串口监测工具看看两次发的数据包有什么不同
谢谢回复。两次发送数据都一样。后来查了下,发现自己弄错了配置。已经弄好了。谢谢!
CT8100 2019-01-24
  • 打赏
  • 举报
回复
串口监测工具看看两次发的数据包有什么不同
老家在JJX 2019-01-22
  • 打赏
  • 举报
回复
引用 3 楼 翅膀又硬了 的回复:
先用串口助手试试 看看是不是设备问题
如果设备正常,装个虚拟串口,拿你软件给调试助手发数据,看看能不能及时收到正确数据
用调试助手测过,正常。但是用代码测试就需要等10秒左右才能重复发代码。
老家在JJX 2019-01-22
  • 打赏
  • 举报
回复
赵老师,我用调试助手,测过,同样的频率发送数据,调试助手,可以完全控制。而代码却需要等一段时间。
翅膀又硬了 2019-01-22
  • 打赏
  • 举报
回复
先用串口助手试试 看看是不是设备问题
如果设备正常,装个虚拟串口,拿你软件给调试助手发数据,看看能不能及时收到正确数据
赵4老师 2019-01-22
  • 打赏
  • 举报
回复
也许是机器出于安全考虑,本来就限制短时间频繁Lon,Loff。
老家在JJX 2019-01-22
  • 打赏
  • 举报
回复
各位大佬,帮忙指点下。谢谢啦!做了一个MFC。串口控制机器开关,每次发送代码"Lon"或者"Loff"。但是每次,开关之间,都要等10秒以上。否则,机器的开关状态没有任何变化。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧