如何实现串口自动接收数据!!!!!!

zhanguo77 2012-02-13 09:39:27
MFC

问题:MCU在进行数据监测,发现数值变化后,就通过串口发送新的数据给PC软件,并显示在对话框。
请问PC方的软件如何判断,MCU已经发给自己数据了?如何接收这些数据?

多多指教!!!!

...全文
866 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxa5201314 2012-03-07
  • 打赏
  • 举报
回复 1
[Quote=引用 11 楼 thelot 的回复:]
1. 先创建线程 m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
2. 配置好串口后恢复线程运行 m_pThread->ResumeThread(); //
3. 在 CommProc 中监听事件
C/C++ code

UI……
[/Quote]

WaitForSingleObject(m_hPostMsgEvent, INFINITE);
这句是等待退出事件?
hdg3707 2012-02-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mjmichael 的回复:]
用微软串口控件MSCOMM32.OCX,添加之窗体加入窗体,双击打开接收响应函数在窗体初始化部分将串口打开就可以了。
[/Quote]
这个最简单,其它的需要调试
MJmichael 2012-02-17
  • 打赏
  • 举报
回复
用微软串口控件MSCOMM32.OCX,添加之窗体加入窗体,双击打开接收响应函数在窗体初始化部分将串口打开就可以了。
zhanguo77 2012-02-14
  • 打赏
  • 举报
回复
有个疑问。
OVERLAPPED os;
这个os其实应该ReadFile里的m_OverlappedRead,是吧?
ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
在我的程序里要改成OVERLAPPED m_OverlappedRead;是吧?

如果是这样的话,
我的软件要求是,一边监听从MCU自动传来数据,一边自己还要利用ReadFile,从MCU来读取其他的数据。
在监听程序里,m_OverlappedRead做了一些操作,而自己读数据时,也会用到ReadFile里的m_OverlappedRead。
这样会不会互相影响,从而使程序混乱呢?



oushengfen 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 thelot 的回复:]
1. 先创建线程 m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
2. 配置好串口后恢复线程运行 m_pThread->ResumeThread(); //
3. 在 CommProc 中监听事件

C/C++ code

U……
[/Quote]

楼主,你的代码是不是有点问题?

if(WaitCommEvent(m_hCom, &dwMask, &os)) // 重叠操作
应该改成if(!WaitCommEvent(m_hCom, &dwMask, &os)) // 重叠操作
shn521 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhanguo77 的回复:]
求助,谁有什么好办法
[/Quote]
上面的方法都是可行的,你还要什么好办法?
zhanguo77 2012-02-14
  • 打赏
  • 举报
回复
求助,谁有什么好办法
用户 昵称 2012-02-13
  • 打赏
  • 举报
回复
开个线程一直接收就行了。
zhanguo77 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zgl7903 的回复:]

如果没有特别的要求的话, 下载个串口精灵 或者用系统自带的超级终端即可使用
[/Quote]

有要求,我要做这样的软件
zgl7903 2012-02-13
  • 打赏
  • 举报
回复
如果没有特别的要求的话, 下载个串口精灵 或者用系统自带的超级终端即可使用
zhanguo77 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arpnet99 的回复:]

多线程,一直监听。
[/Quote]

不知道什么是监听,求教监听实现方法
wyx100 2012-02-13
  • 打赏
  • 举报
回复
多线程,一直监听。
这不是鸭头 2012-02-13
  • 打赏
  • 举报
回复
多线程,一直监听。
zhanguo77 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 g6785654 的回复:]

通过CreateFile、WriteFile、ReadFile读串口数据,再开个定时器实时监听传上来的数据,自己写个匹配算法,先将数据放到算法中验证和上一次的是否相同,相同则抛弃,否则传出操作就行了。
[/Quote]

定时器监听,怎么使用?
Ginie 2012-02-13
  • 打赏
  • 举报
回复
通过CreateFile、WriteFile、ReadFile读串口数据,再开个定时器实时监听传上来的数据,自己写个匹配算法,先将数据放到算法中验证和上一次的是否相同,相同则抛弃,否则传出操作就行了。
TechStone 2012-02-13
  • 打赏
  • 举报
回复
LINUX下面有select和poll可以处理读串口的情况,WIN32下应该也有对应的函数吧。
thelot 2012-02-13
  • 打赏
  • 举报
回复
1. 先创建线程 m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
2. 配置好串口后恢复线程运行 m_pThread->ResumeThread(); //
3. 在 CommProc 中监听事件

UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
while(m_bConnected)
{
dwMask=0;
if(WaitCommEvent(m_hCom, &dwMask, &os)) // 重叠操作
{

if(GetLastError()==ERROR_IO_PENDING)
// 无限等待重叠操作结果
GetOverlappedResult(m_hCom, &os, &dwTrans, TRUE);
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
else
{
if (dwMask&EV_RXCHAR){
WaitForSingleObject(m_hPostMsgEvent, INFINITE);

/* 收到字符,可以通过PostMessage等方法通知主程序*/
在这里添加代码

}

if (dwMask&EV_TXEMPTY) {
WaitForSingleObject(m_hPostMsgEvent, INFINITE);

/* 发送字符完毕*/

在这里添加代码


}
}
}
CloseHandle(os.hEvent);
return 0;
}


shn521 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhanguo77 的回复:]
引用 8 楼 jennyvenus 的回复:

开个线程一直接收就行了。


一直接收也要有个判断吧?
怎么判断有没有数据被发送过来?
[/Quote]
看看百度文档,串口编程,都是一个套路
zhanguo77 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jennyvenus 的回复:]

开个线程一直接收就行了。
[/Quote]

一直接收也要有个判断吧?
怎么判断有没有数据被发送过来?

2,640

社区成员

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

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