请教一个老问题:有关串口的异步操作

mycrazycracy 2012-03-20 10:03:24
原来一直在用单片机写程序,现在开始做上位机。好像windows提供了串口的异步访问方式,能够提供非阻塞的串口操作函数。
我想知道有没有一种像单片机类似的中断处理方式,就是每当串口有数据进入是进入一个中断函数,在中断函数函数中进行相应的处理?因为要保证不因为程序的阻塞而丢失串口的任何数据。
是不是还可以使用开启新线程的方法来保证及时处理串口数据?要如何同步呢?
希望大家最好能给一个代码的示例,保证主程序在处理其他内容时能完全接收串口的数据即可。谢谢啦~~~
...全文
84 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2012-03-27
  • 打赏
  • 举报
回复
缓冲区设置大一点,不用担心数据的丢失问题,驱动会为你缓存接收到的数据,只要缓冲区不被填满,不会因为不能及时读取数据而丢失数据

Serial Communications in Win32
诶呦 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mycrazycracy 的回复:]
引用 1 楼 echoyin59 的回复:

推荐龚建伟的《Visual C++_Turbo C串口通信编程实践》,里面有控件和写好的类
你问的问题都有说到(参考CSerialPort类),看前几章就可以了

不想用MFC。。。要改写下
[/Quote]
参考CSerialPort的写法,拿API实现的
mycrazycracy 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chayedanwc 的回复:]

打开端口
C/C++ code

pIniPort->hFile = CreateFile(_T("COM1"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
……
[/Quote]
主要想用接受的,谢谢!
mycrazycracy 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 echoyin59 的回复:]

推荐龚建伟的《Visual C++_Turbo C串口通信编程实践》,里面有控件和写好的类
你问的问题都有说到(参考CSerialPort类),看前几章就可以了
[/Quote]
不想用MFC。。。要改写下
chayedanwc 2012-03-21
  • 打赏
  • 举报
回复
打开端口

pIniPort->hFile = CreateFile(_T("COM1"),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS, FILE_FLAG_OVERLAPPED,
NULL);


下发数据

BOOL WriteABuffer(HANDLE hComm, char * lpBuf, DWORD dwToWrite,LPDWORD dwWritten)
{
OVERLAPPED osWrite = {0};
DWORD dwRes = 0xFFFFFFFF;
BOOL fRes;

// Create this write operation's OVERLAPPED structure's hEvent.
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osWrite.hEvent == NULL)
// error creating overlapped event handle
return FALSE;

// Issue write.
if (!WriteFile(hComm, lpBuf, dwToWrite, dwWritten, &osWrite))
{
if (GetLastError() != ERROR_IO_PENDING)
{
// WriteFile failed, but isn't delayed. Report error and abort.
fRes = FALSE;
}
else
// Write is pending.
dwRes = WaitForSingleObject(osWrite.hEvent, INFINITE);
switch(dwRes)
{
// OVERLAPPED structure's event has been signaled.
case WAIT_OBJECT_0:
if (!GetOverlappedResult(hComm, &osWrite, dwWritten, FALSE))
fRes = FALSE;
else
// Write operation completed successfully.
fRes = TRUE;
break;

default:
// An error has occurred in WaitForSingleObject.
// This usually indicates a problem with the
// OVERLAPPED structure's event handle.
fRes = FALSE;
break;
}

}
else
// WriteFile completed immediately.
fRes = TRUE;

CloseHandle(osWrite.hEvent);
return fRes;
}
诶呦 2012-03-21
  • 打赏
  • 举报
回复
推荐龚建伟的《Visual C++_Turbo C串口通信编程实践》,里面有控件和写好的类
你问的问题都有说到(参考CSerialPort类),看前几章就可以了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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