写了个串口程序,重启电脑后就接受不到信息了

pc12138cwp 2021-04-07 04:40:59
写了个串口程序,重启电脑后,串口就接受不到信息了,这是怎么回事?

这个时候用串口工具随便发送一条信息过去,接着再打开自己的串口程序,如果不重启电脑,程序就一直都能正常收发信息了,这是怎么一回事啊?

是我自己程序的问题吗?
...全文
2597 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2021-04-07
GetCommState 之前 DCB 要先赋值 DCBlength DCB dcb = { sizeof(DCB) }; GetCommState(m_hCom, &dcb);
  • 打赏
  • 举报
回复
pc12138cwp 2021-04-07
这里错了? 我发现当执行 SetCommState 是程序报错,也就是设置串口的时候出现错误了。再仔细检查发现设置 dcb.StopBits属性时直接赋值为1,然而事实上这并不代表停止位为1,而是1.5。关于StopBits 的描述是这样子的:dcb.StopBits //两个停止位 0,1,2 = 1, 1.5, 2 ,当StopBits 值为0是代表停止位为1,值为1时代表停止位为1.5。而计算机并没有1.5这个设置,因此 SetCommState 报错,也就是初始化串口没有成功。 ———————————————— 版权声明:本文为CSDN博主「kfhzy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/kfhzy/article/details/11607545
  • 打赏
  • 举报
回复
pc12138cwp 2021-04-07
是我串口没有打开?或者是电脑问题,第一次打开串口有什么特别的东西要做,我程序中没写? 我发送数据下去,程序既不执行指令,也不回报信息。 用一个串口监控软件看了下,只有下发的信息,没有读取到信息
  • 打赏
  • 举报
回复
pc12138cwp 2021-04-07

int CHTDLPCard::OpenPort() //打开串口
{
	CString strComm;
	int die;
	die = ::GetPrivateProfileInt("HARDWARE", "卡串口号", 0, ".\\card.ini");
	strComm.Format("%s%d", "COM", die);
	m_hCom = CreateFile(strComm,//COM1口
		GENERIC_READ | GENERIC_WRITE, //允许读和写
		0, //独占方式
		NULL,
		OPEN_EXISTING, //打开而不是创建
		0, //同步方式
		NULL);

	int a = GetLastError();
	if (m_hCom == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("卡串口打开失败");
		m_bOpen = FALSE;
		return FALSE;
	}
	//else
		//AfxMessageBox("打开串口成功");

	SetCommMask(m_hCom, EV_RXCHAR);
	//清干净输入、输出缓冲区
	PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

	SetupComm(m_hCom, 2048, 2048); //输入缓冲区和输出缓冲区的大小都是1024
	COMMTIMEOUTS TimeOuts;
	//设定读超时
	TimeOuts.ReadIntervalTimeout = MAXDWORD;//把间隔超时设为最大,把总超时设为0,将导致ReadFile立即返回并完成操作
	TimeOuts.ReadTotalTimeoutMultiplier = 1;
	TimeOuts.ReadTotalTimeoutConstant = 5;
	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier = 1;
	TimeOuts.WriteTotalTimeoutConstant = 5;
	SetCommTimeouts(m_hCom, &TimeOuts); //设置超时
	GetCommState(m_hCom, &dcb);
	dcb.BaudRate = m_nBaud; //波特率为9600
	dcb.ByteSize = m_nDataBits; //每个字节有8位
	dcb.Parity = m_nParity; //无奇偶校验位
	dcb.StopBits = m_nStopBits; //停止位
	SetCommState(m_hCom, &dcb);
	m_bOpen = TRUE;

	COMSTAT ComStat;
	DWORD   dwErrorFlags = 0;
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);

	return 1;
}



int CHTDLPCard::SendData(HANDLE com /*串口号*/,
	BYTE bFun /*功能码*/,
	BYTE bDataLen /*数据长度*/,
	BYTE* pbData /*数据*/)            //发送数据,例如SendData(com, 0x01, 0, NULL)
{
	//检查参数
	if (bDataLen < 0)
		return 0;

	//总目标发送长度
	int iTxLen = 0
		+ 2 //字节头
		+ 1 //功能码
		+ 1 //字节长度
		+ bDataLen //数据长度
		+ 2 //校验
		+ 2 //字节尾
		+ 0;

	//申请缓冲区
	BYTE* pTxData = new BYTE[iTxLen];

	//构造发送数据帧
	int iOfst = 0;

	pTxData[iOfst] = 0xC1; iOfst++;//字节头
	pTxData[iOfst] = 0xC2; iOfst++;

	pTxData[iOfst] = bFun; iOfst++;//功能码

	pTxData[iOfst] = bDataLen + 2; /*数据位+两个校验位*/ iOfst++;//字节长度

	memcpy(pTxData + iOfst, pbData, bDataLen); iOfst += bDataLen;//数据

	{  //计算校验位
		uint16_t checksum = getChecksum(pTxData, iOfst);

		//ULONG uSumL = 0;//之前所有数据的累计和
		//for (int n = 0; n < iOfst; n++) { uSumL += pTxData[n]; }
		////(高16位+低16位)后取反
		//WORD wSum = (WORD)(~(HIWORD(uSumL) + LOWORD(uSumL)));

#ifdef _BIG_ENDIAN //大端模式
		pTxData[iOfst] = checksum >> 8; iOfst++;
		pTxData[iOfst] = checksum; iOfst++;
		//pTxData[iOfst] = HIBYTE(wSum); iOfst++;
		//pTxData[iOfst] = LOBYTE(wSum); iOfst++;
#else //!_BIG_ENDIAN //小端模式    
		pTxData[iOfst] = checksum >> 8; iOfst++;
		pTxData[iOfst] = checksum; iOfst++;
		//pTxData[iOfst] = LOBYTE(wSum); iOfst++;
		//pTxData[iOfst] = HIBYTE(wSum); iOfst++;
#endif 

	}

	pTxData[iOfst] = 0x0A; iOfst++;//字节尾
	pTxData[iOfst] = 0x0D; iOfst++;


	//COMSTAT ComStat;  //清理缓冲区
	//DWORD dwErrorFlags;
	//ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
	//PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

	//这里用串口等通讯接口发送数据
	DWORD bytesWritten;
	bool ret = WriteFile(com, pTxData, iOfst, &bytesWritten, 0);
	//结束清理
	delete[] pTxData;
	if (ret)
		return  1;
	else
		return 0;
}
  • 打赏
  • 举报
回复
相关推荐
发帖
ATL
加入

3231

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
申请成为版主
帖子事件
创建了帖子
2021-04-07 04:40
社区公告
暂无公告