createevent(C++ 串口API 异步操作)

2024-07-09 11:19:02 22

createevent(C++ 串口API 异步操作)

本文目录

C++ 串口API 异步操作

初始化://串行设备句柄; HANDLE hComDev=0; //串口打开标志; BOOL bOpen=FALSE; //线程同步事件句柄; HANDLE hEvent=0; DCB dcb; COMMTIMEOUTS timeouts; //设备已打开 if(bOpen) return FALSE; //打开COM1 if((hComDev=CreateFile(“COM1”,GENERIC�READ|GENERIC�WRITE,0,NULL,OPEN�EXISTING,FILE�ATTRIBUTE�NORMAL,NULL))==INVALID�HANDLE�VALUE) return FALSE; //设置超时控制 SetCommTimeouts(hComDev,&timeouts); //设置接收缓冲区和输出缓冲区的大小 SetupComm(hComDev,1024,512); //获取缺省的DCB结构的值 GetCommState(hComDev,&dcb); //设定波特率为9600 bps dcb.BaudRate=CBR�9600; //设定无奇偶校验 dcb.fParity=NOPARITY; //设定数据位为8 dcb.ByteSize=8; //设定一个停止位 dcb.StopBits=ONESTOPBIT; //监视串口的错误和接收到字符两种事件 SetCommMask(hComDev,EV�ERR|EV�RXCHAR); //设置串行设备控制参数 SetCommState(hComDev,&dcb); //设备已打开 bOpen=TRUE; //创建人工重设、未发信号的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”); //创建一个事件监视线程来监视串口事件 AfxBeginThread(CommWatchProc,pParam); }数据发送 数据发送利用WriteFile()函数实现。对于同步I/O操作,它的最后一个参数可为NULL;而对异步I/O操作,它的最后一个参数必需是一个指向OVERLAPPED结构的指针,通过OVERLAPPED结构来获得当前的操作状态。 BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite) { //lpSndBuffer为发送数据缓冲区指针, dwBytesToWrite为将要发送的字节长度 //设备已打开 BOOL bWriteState; //实际发送的字节数 DWORD dwBytesWritten; //设备未打开 if(!bOpen) return FALSE; bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,&dwBytesWritten,NULL); if(!bWriteState || dwBytesToWrite!=dwBytesWritten) //发送失败 return FALSE; else //发送成功 return TRUE; } 数据接收 接收数据的任务由ReadFile函数完成。该函数从串口接收缓冲区中读取数据,读取数据前,先用ClearCommError函数获得接收缓冲区中的字节数。接收数据时,同步和异步读取的差别同发送数据是一样的。 DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead) { //lpInBuffer为接收数据的缓冲区指针, dwBytesToRead为准备读取的数据长度(字节数) //串行设备状态结构 COMSTAT ComStat; DWORD dwBytesRead,dwErrorFlags; //设备未打开 if(!bOpen) return 0; //读取串行设备的当前状态 ClearCommError(hComDev,&dwErrorFlags,&ComStat); //应该读取的数据长度 dwBytesRead=min(dwBytesToRead,ComStat.cbInQue); if(dwBytesRead》0) //读取数据 if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,&dwBytesRead,NULL)) dwBytesRead=0; return dwBytesRead; } 事件监视线程 事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。 UINT CommWatchProc(LPVOID pParam) { DWORD dwEventMask=0; //发生的事件; while(bOpen) { //等待监视的事件发生 WaitCommEvent(hComDev, &dwEventMask,NULL); if ((dwEventMask & EV�RXCHAR)==EV�RXCHAR) ……//接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理 if(dwEventMask & EV�ERR)==EV�ERROR) ……//发生错误时的处理 } SetEvent(hEvent); //发信号,指示监视线程结束 return 0; } 关闭串行设备 在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发送/接收缓冲区和关闭设备句柄。 void CloseSynComm() { if(!bOpen) return; //结束事件监视线程 bOpen=FALSE; SetCommMask(hComDev,0); //取消事件监视,此时监视线程中的WaitCommEvent将返回 WaitForSingleObject(hEvent,INFINITE); //等待监视线程结束 CloseHandle(hEvent); //关闭事件句柄 //停止发送和接收数据,并清除发送和接收缓冲区 PurgeComm(hComDev,PURGE�TXABORT| PURGE�RXABORT|PURGE�TXCLEAR|PURGE�RXCLEAR); //关闭设备句柄 CloseHandle(hComDev); }

请教高人,在C#中怎么写一个API的event,最好能给个实例,只写了一个createevent但不知道怎么弄了

private void ReceiveThread() { byte buf = new Byte; uint gotbytes; bool starting; starting = true; AutoResetEvent sg = new AutoResetEvent(false); Win32Com.OVERLAPPED ov = new Win32Com.OVERLAPPED(); IntPtr unmanagedOv; IntPtr uMask; uint eventMask = 0; unmanagedOv = Marshal.AllocHGlobal(Marshal.SizeOf(ov)); uMask = Marshal.AllocHGlobal(Marshal.SizeOf(eventMask)); ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = sg.Handle; Marshal.StructureToPtr(ov, unmanagedOv, true); try { while(true) { if (!Win32Com.SetCommMask(hPort, Win32Com.EV_RXCHAR | Win32Com.EV_TXEMPTY | Win32Com.EV_CTS | Win32Com.EV_DSR | Win32Com.EV_BREAK | Win32Com.EV_RLSD | Win32Com.EV_RING | Win32Com.EV_ERR)) { throw new CommPortException(“IO Error “); } Marshal.WriteInt32(uMask, 0); //JH 1.2: Tells the main thread that this thread is ready for action. if (starting) {startEvent.Set(); starting = false;} if (!Win32Com.WaitCommEvent(hPort, uMask, unmanagedOv)) { if (Marshal.GetLastWin32Error() == Win32Com.ERROR_IO_PENDING) { sg.WaitOne(); } else { throw new CommPortException(“IO Error “); } } eventMask = (uint)Marshal.ReadInt32(uMask); if ((eventMask & Win32Com.EV_ERR) != 0) { UInt32 errs; if (Win32Com.ClearCommError(hPort, out errs, IntPtr.Zero)) { //JH 1.2: BREAK condition has an error flag and and an event flag. Not sure if both //are always raised, so if CE_BREAK is only error flag ignore it and set the EV_BREAK //flag for normal handling. Also made more robust by handling case were no recognised //error was present in the flags. (Thanks to Fred Pittroff for finding this problem!) int ec = 0; StringBuilder s = new StringBuilder(“UART Error: “, 40); if ((errs & Win32Com.CE_FRAME) != 0) {s = s.Append(“Framing,“); ec++;} if ((errs & Win32Com.CE_IOE) != 0) {s = s.Append(“IO,“); ec++;} if ((errs & Win32Com.CE_OVERRUN) != 0) {s = s.Append(“Overrun,“); ec++;} if ((errs & Win32Com.CE_RXOVER) != 0) {s = s.Append(“Receive Cverflow,“); ec++;} if ((errs & Win32Com.CE_RXPARITY) != 0) {s = s.Append(“Parity,“); ec++;} if ((errs & Win32Com.CE_TXFULL) != 0) {s = s.Append(“Transmit Overflow,“); ec++;} if (ec 》 0) { s.Length = s.Length - 1; throw new CommPortException(s.ToString()); } else { if (errs == Win32Com.CE_BREAK) { eventMask |= Win32Com.EV_BREAK; } else { throw new CommPortException(“IO Error “); } } } else { throw new CommPortException(“IO Error “); } } if ((eventMask & Win32Com.EV_RXCHAR) != 0) { do { gotbytes = 0; if (!Win32Com.ReadFile(hPort, buf, 1, out gotbytes, unmanagedOv)) { //JH 1.1: Removed ERROR_IO_PENDING handling as comm timeouts have now //been set so ReadFile returns immediately. This avoids use of CancelIo //which was causing loss of data. Thanks to Daniel Moth for suggesting this //might be a problem, and to many others for reporting that it was! int x = Marshal.GetLastWin32Error(); throw new CommPortException(“IO Error “); } if (gotbytes == 1) OnRxChar(buf); } while (gotbytes 》 0); } if ((eventMask & Win32Com.EV_TXEMPTY) != 0) { //JH1.3: lock(empty) empty = true; OnTxDone(); } if ((eventMask & Win32Com.EV_BREAK) != 0) OnBreak(); uint i = 0; if ((eventMask & Win32Com.EV_CTS) != 0) i |= Win32Com.MS_CTS_ON; if ((eventMask & Win32Com.EV_DSR) != 0) i |= Win32Com.MS_DSR_ON; if ((eventMask & Win32Com.EV_RLSD) != 0) i |= Win32Com.MS_RLSD_ON; if ((eventMask & Win32Com.EV_RING) != 0) i |= Win32Com.MS_RING_ON; if (i != 0) { uint f; if (!Win32Com.GetCommModemStatus(hPort, out f)) throw new CommPortException(“IO Error “); OnStatusChange(new ModemStatus(i), new ModemStatus(f)); } } } catch (Exception e) { //JH 1.3: Added for shutdown robustness (Thanks to Fred Pittroff, Mark Behner and Kevin Williamson!), . Win32Com.CancelIo(hPort); if (uMask != IntPtr.Zero) Marshal.FreeHGlobal(uMask); if (unmanagedOv != IntPtr.Zero) Marshal.FreeHGlobal(unmanagedOv); if (!(e is ThreadAbortException)) { rxException = e; OnRxException(e); } }仅供参考 }

createevent(C++ 串口API 异步操作)

本文编辑:admin
异步 ,createevent

更多文章:


two的中文?Two怎么读,什么意思

two的中文?Two怎么读,什么意思

本文目录two的中文Two怎么读,什么意思twos是什么意思oneonestwo没有twostwo的中文two的意思是两个,两个的,句中作为名词、形容词和代词使用。一、词汇分析two英 n. 两个adj. 两个的num. 二二、短语1、Bi

2024年7月24日 12:39

habitual(habit形容词)

habitual(habit形容词)

其实habitual的问题并不复杂,但是又很多的朋友都不太了解habit形容词,因此呢,今天小编就来为大家分享habitual的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录habit形容词Habitua什么意思

2024年6月28日 11:30

except的用法总结(英语中关于expect besides expect for等表示除了的用法)

except的用法总结(英语中关于expect besides expect for等表示除了的用法)

大家好,今天小编来为大家解答以下的问题,关于except的用法总结,英语中关于expect besides expect for等表示除了的用法这个很多人还不知道,现在让我们一起来看看吧!本文目录英语中关于expect besides ex

2024年7月2日 05:50

为什么编程语言不能是中文(计算机的汇编语言为什么没有中文的版本)

为什么编程语言不能是中文(计算机的汇编语言为什么没有中文的版本)

“为什么编程语言不能是中文”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看为什么编程语言不能是中文(计算机的汇编语言为什么没有中文的版本)!本文目录计算机的汇编语言为什么没有中文的版本为什么程序员都不用中文来编程呢英语不好的

2024年8月11日 01:50

explore名词形式(Explore的名词)

explore名词形式(Explore的名词)

大家好,关于explore名词形式很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Explore的名词的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录E

2024年7月24日 11:00

excel函数公式设置颜色(excel怎么用IF函数,改变字体的颜色)

excel函数公式设置颜色(excel怎么用IF函数,改变字体的颜色)

大家好,如果您还对excel函数公式设置颜色不太了解,没有关系,今天就由本站为大家分享excel函数公式设置颜色的知识,包括excel怎么用IF函数,改变字体的颜色的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录e

2024年7月16日 17:25

spring festival初一作文(我的春节英语作文 初一水平的)

spring festival初一作文(我的春节英语作文 初一水平的)

本文目录我的春节英语作文 初一水平的七年级英语作文: My Spring Festival Plans我的春节英语作文 初一水平的MySpringFestivalTheSpringFestivalisatraditionalChineseh

2024年6月6日 02:28

caution的形容词(caution 和 careful 和 attention的区别和用法是什么)

caution的形容词(caution 和 careful 和 attention的区别和用法是什么)

本文目录caution 和 careful 和 attention的区别和用法是什么caution什么意思be后面的caution用什么形式caution和warning有什麽区别caution 和 cautious是同根词吗caution

2024年7月1日 12:15

plc入门视频教程(有没有懂plc的,新手该怎么学习)

plc入门视频教程(有没有懂plc的,新手该怎么学习)

本文目录有没有懂plc的,新手该怎么学习plc学习的入门梯形图程序都有哪些致PLC初学者的入门一课,七大误区如何解决有没有懂plc的,新手该怎么学习1:准备的东西1)要选好PLC机型,一般选择大品牌的公司产品,操作规范简易。2)准备相应的软

2024年6月28日 17:19

共创世界编程网站(共创世界如何导入图片)

共创世界编程网站(共创世界如何导入图片)

大家好,关于共创世界编程网站很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于共创世界如何导入图片的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录共创世界

2024年9月8日 06:50

return to normal(英语Normal font怎么翻译)

return to normal(英语Normal font怎么翻译)

本文目录英语Normal font怎么翻译normal是什么意思Return to normal 中的normal 不是名词吗 为什么老师说是特殊用法 是形容词general与normal的区别return tonormal什么意思retu

2024年7月22日 20:28

后印象派三杰(梵高是不是意大利文艺复兴的三大先驱)

后印象派三杰(梵高是不是意大利文艺复兴的三大先驱)

本文目录梵高是不是意大利文艺复兴的三大先驱文艺复兴 美术三杰 荷兰的伦勃朗 西班牙的维拉斯凯斯 印象主义 后印象主义 莫奈文艺复兴中,达芬奇、米开朗琪罗和谁并称美术三杰象征主义的主导性人物:高更自画像系列文艺复兴美术三杰指的是达芬奇米开朗基

2024年4月30日 02:50

c语言课程设计答辩问题(课程设计要答辩 C语言没怎么学 可以简单讲解一下这个程序么 帮忙加一下注释)

c语言课程设计答辩问题(课程设计要答辩 C语言没怎么学 可以简单讲解一下这个程序么 帮忙加一下注释)

本篇文章给大家谈谈c语言课程设计答辩问题,以及课程设计要答辩 C语言没怎么学 可以简单讲解一下这个程序么 帮忙加一下注释对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,

2024年8月22日 19:15

svg动态无功补偿装置的作用(SVG无功补偿的功能有哪些)

svg动态无功补偿装置的作用(SVG无功补偿的功能有哪些)

本文目录SVG无功补偿的功能有哪些什么是SVG型无功补偿光伏电站现在都用SVG进行无功补偿吗SVG、SVC、FC这三种无功补偿装置的区别是什么SVG与SVC无功补偿原理区别电力系统中的SVG和FC都是起什么作用的电力系统中SVG是什么变电站

2023年7月17日 05:20

dos系统怎么进入(在windows中进入ms-dos有几种方法)

dos系统怎么进入(在windows中进入ms-dos有几种方法)

大家好,dos系统怎么进入相信很多的网友都不是很明白,包括在windows中进入ms-dos有几种方法也是一样,不过没有关系,接下来就来为大家分享关于dos系统怎么进入和在windows中进入ms-dos有几种方法的一些知识点,大家可以关注

2024年7月14日 16:41

hamburger是什么意思中文(hamburger翻译中文是什么意思)

hamburger是什么意思中文(hamburger翻译中文是什么意思)

本文目录hamburger翻译中文是什么意思hamburger什么意思中文翻译汉堡包英文是什么hamburger的中文意思hamburger中文翻译hamburger的中文是什么hamburgur是什么意思中文翻译是什么意思中文汉堡包用英语

2024年6月30日 22:28

右移运算符的介绍?C语言中移位运算

右移运算符的介绍?C语言中移位运算

本文目录右移运算符的介绍C语言中移位运算Java中右移运算C程序中,左移“>” 的具体用法是什么右移运算符的作用C的右移运算符什么用右移运算符的基本信息C语言>>右移运算右移运算符的介绍右移运算符,移位运算符的一种:程序设计中,位操作运算符

2024年7月4日 00:22

正则截取部分字符串(python 正则表达式如何截取字符串中间的内容)

正则截取部分字符串(python 正则表达式如何截取字符串中间的内容)

大家好,如果您还对正则截取部分字符串不太了解,没有关系,今天就由本站为大家分享正则截取部分字符串的知识,包括python 正则表达式如何截取字符串中间的内容的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录pytho

2024年10月18日 03:50

大学生自学网app下载(大学生在使用电脑的同时,应该学会哪些对以后工作有用的软件或者技能呢)

大学生自学网app下载(大学生在使用电脑的同时,应该学会哪些对以后工作有用的软件或者技能呢)

本文目录大学生在使用电脑的同时,应该学会哪些对以后工作有用的软件或者技能呢除了Office,还有哪些值得大学生学习的软件大学生自学刷题的软件有什么推荐吗大学生在使用电脑的同时,应该学会哪些对以后工作有用的软件或者技能呢由于不知道你的专业,所

2024年5月17日 18:19

matlab编程与工程应用第三版课后答案(MATLAB与系统仿真 试题)

matlab编程与工程应用第三版课后答案(MATLAB与系统仿真 试题)

本文目录MATLAB与系统仿真 试题求两道matlab编程题Matlab问题求信号与系统基础--应用WEB和MATLAB_第三版_Edward答案,急MATLAB编程解决运输问题图是我在matlab编程时遇到的问题 请问最后答案为甚是1 还

2024年4月21日 13:05

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1735
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索