win32 MFC api串口通讯请教问题。

康王1991 2016-07-02 07:17:51
想请教大家一个问题,我最近想做一个类似于串口助手的小窗口程序,使用MFC框架,win API来实现收发数据。我是参考一本资料书的程序,也加了一些自己的小功能,基本功能都可以实现了。

但是,我的问题是:为什么发送数据感觉不对或是不全。
if (WriteFile(hCom, m_strSend, 8, &factdata, &wOverLaped))//开始发送数据
这句代码writefile第三个参数到底怎么控制?我用sizeof来判定长度也不对,我用8,比如我发123,串口助手收到的是1*2*3*,不知道是很么原因,找了很久,不解。
下面是我的部分代码
1>声明:
// 发送区域
CString m_strSend;
2>消息映射:
DDX_Text(pDX, IDC_send, m_strSend);
3>发送按钮函数
void CTongxunAPPDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
//m_strReceive = m_strSend;
DWORD res;
COMSTAT rst;
DWORD factdata = 0;
wOverLaped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//创建一个事件对象
IsStop = FALSE;
ClearCommError(hCom, &res, &rst);
if (WriteFile(hCom, m_strSend, 8, &factdata, &wOverLaped))//开始发送数据
{
IsStop = TRUE;
}

else
{
res = WaitForSingleObject(wOverLaped.hEvent, 1000); //延时5秒,等待数据发送
if (WAIT_OBJECT_0 == res)//如果事件处于有信号状态,表示发送完成
{
IsStop = TRUE;
}
else
IsStop = FALSE;
Sleep(1000); //延时1000毫秒钟
}
}

...全文
689 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mobi5027 2018-07-19
  • 打赏
  • 举报
回复
能否发一下源码参考一下,刚刚进入公司的小白
goukui5707 2017-08-11
  • 打赏
  • 举报
回复
楼主,可否发一份你的源码 1023090233@qq.com感谢
sdghchj 2016-07-03
  • 打赏
  • 举报
回复
你这工程项目用的UNICODE编码,CString实际上是CStringW的typedef别名,一个字符占两个字节,所以收方收到的是“1\02\03\0”. 收发双方要保证字符串编码一致才行。 可以把项目改成不使用UNICODE字符集。
康王1991 2016-07-03
  • 打赏
  • 举报
回复
引用 5楼zgl7903 的回复:
CStringA 转一下
CStringA strA(m_strSend);
if (WriteFile(hCom,  strA,  strA.GetLength(), &factdata, &wOverLaped))//开始发送数据
{
}
else
{
   if(GetLastError() == ERROR_IO_INCOMPLETE)
   {
      GetOverlappedResult(hCom, &wOverLaped, &factdata,  TRUE);
   }
}
嗯,谢谢,转换下应该也可以,不使用多字节字符集也可以。谢谢。
康王1991 2016-07-03
  • 打赏
  • 举报
回复
引用 2楼sdghchj 的回复:
你这工程项目用的UNICODE编码,CString实际上是CStringW的typedef别名,一个字符占两个字节,所以收方收到的是“1\02\03\0”. 收发双方要保证字符串编码一致才行。 可以把项目改成不使用UNICODE字符集。
谢谢,正解,设置下就好了。感谢
zgl7903 2016-07-03
  • 打赏
  • 举报
回复
CStringA 转一下
CStringA strA(m_strSend);
if (WriteFile(hCom,  strA,  strA.GetLength(), &factdata, &wOverLaped))//开始发送数据
{
}
else
{
   if(GetLastError() == ERROR_IO_INCOMPLETE)
   {
      GetOverlappedResult(hCom, &wOverLaped, &factdata,  TRUE);
   }
}
qinlj0 2016-07-03
  • 打赏
  • 举报
回复
搞串口通信建议去淘弄NT6,NT5.1逐步放弃维护了。
schlafenhamster 2016-07-03
  • 打赏
  • 举报
回复
异步写参考

///////////////////////////////////////////////////////////
int CDload::WriteCommBlock(BYTE *pBlock,int nBlockLen)
{  //return 0 if error
	DWORD dwBytesWritten;
	DWORD dwModemStat;
	int   WaitErr;
	BOOL  fWriteStat;

	if (!m_bConnected) return 0;
	dwBytesWritten=0;
	fWriteStat=WriteFile(m_idComDev,pBlock,nBlockLen,&dwBytesWritten,&m_osWrite);
	if(!fWriteStat) 
	{   // Writting wait
		if (GetLastError()==ERROR_IO_PENDING)
		{  // if writting processing
//???		ResetEvent(m_osWrite.hEvent);//???
			if (WaitErr=WaitForSingleObject(m_osWrite.hEvent,60000)) // 1 minute
			{   // WaitErr!=0
				if(WaitErr==WAIT_TIMEOUT) 
				{  // time out
					KillTimer(1);
// if device error! 
					GetCommModemStatus(m_idComDev,&dwModemStat); 
					if(dwModemStat &= MS_CTS_ON) // if (CTS_ON && TIME_OUT) then COMM Hardware Errors.
					{ // 16 "GREEN"
						AfxMessageBox("COMM Device hardware errors.",MB_ICONSTOP);// don't move
						m_bLoadStop=1;
						dwBytesWritten=0;
					}
					else
					{ // 0 "RED"
						AfxMessageBox("CTS timer 60 seconds out!",MB_ICONSTOP);
						m_bLoadStop=1;
						dwBytesWritten=0;
					}
				}
//				if(WaitErr==WAIT_FAILED) =-1
//				else other waiterr
			}
			else
			{ // WaitErr=0.if you SetEvent(m_osWrite.hEvent) anywhere else
				GetOverlappedResult(m_idComDev,&m_osWrite,&dwBytesWritten,FALSE);
				m_osWrite.Offset +=dwBytesWritten;
			}
		}
//		else  // not IO_PENDING
	}
	return (int)dwBytesWritten;
}

康王1991 2016-07-02
  • 打赏
  • 举报
回复
问题截图

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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