永发信息网

C语言-串口数据接收

答案:2  悬赏:0  手机版
解决时间 2021-05-03 02:50

假设我想COM1发送了一个数据,我怎么写才能读取那个数据呢?用C语言。

读取以后我怎么回发一个数据呢?

最佳答案
看看 龚建伟 的书吧

Visual C++_Turbo C串口通信编程实践
有 pdf 文档
找不到 可以联系
全部回答

可以使用API函数来完成

在文件头假如WINDOWS库

#include <windows.h>

这样就可以条用api文件了

如果需要时时性高的话,就需要用到多线程操作。

1、创建异步端口

m_hCom=CreateFile(m_sPort, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if((m_hPostMsgEven=CreateEvent(NULL,true,true,NULL))==NULL) { TRACE("创建消息事件信号错"); return(false); }

memset(&m_osRead,0,sizeof(OVERLAPPED)); memset(&m_osWrite,0,sizeof(OVERLAPPED)); //分配内存并以0初始化

if((m_osRead.hEvent=CreateEvent(NULL,true,false,NULL))==NULL) { TRACE("创建写信号错"); return(false); }

if((m_osWrite.hEvent=CreateEvent(NULL,true,false,NULL))==NULL) { TRACE("创建读信号错"); return(false); }

if(m_hCom==INVALID_HANDLE_VALUE) { AfxMessageBox("无效句柄,端口打开失败"); return(false); }

SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); PurgeComm(m_hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); SetCommMask(m_hCom,EV_RXCHAR); //SetEvent(m_hPostMsgEven);

TimeOuts.ReadIntervalTimeout=50; TimeOuts.ReadTotalTimeoutMultiplier=50; TimeOuts.ReadTotalTimeoutConstant=500;

TimeOuts.WriteTotalTimeoutMultiplier=50; TimeOuts.WriteTotalTimeoutConstant=500;

SetCommTimeouts(m_hCom,&TimeOuts);

2、接收:

DWORD Comm::ReadCom(char *buf, DWORD dwLength) { DWORD length=0; COMSTAT ComStat; DWORD dwErrorFlags;

ClearCommError(m_hCom,&dwErrorFlags,&ComStat);

length=min(dwLength,ComStat.cbInQue);

ReadFile(m_hCom,buf,length,&length,&m_osRead); return(length); }

3、发送

DWORD Comm::WriteCom(char *buf, DWORD dwLength) { bool fstate; DWORD length=0,dwError; COMSTAT ComStat; char ch[10]; sprintf(ch,"010201"); ClearCommError(m_hCom,&dwError,&ComStat); fstate=WriteFile(m_hCom,ch,strlen(ch),&length,&m_osWrite); if(!fstate) { if(GetLastError()==ERROR_IO_PENDING) { TRACE("ERROR_IO_PENDING"); GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE); } else { TRACE("Write Com Failure"); length=0; } }

return(length); }

程序通过等待读写信号来进行读写

发送时直接调用

接受可以通过按钮接收,效果不好,容易漏掉信息

也可以单独创建读线程进行监听,使用方式为中断读取,线程挂起等待中断信号就可以了

等到信号就调用读取函数。

编程思路与C++差别不大,操作方式及界面的区别而已。

核心程序段都是一样的

可以参照C++程序来编写

网上有很多关于C++的范例,可以看下

http://dev.yesky.com/401/2308901.shtml

http://download.csdn.net/source/640848

http://blog.ednchina.com/lhx127/124939/message.aspx

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
拿K宝,能不能在农业银行取钱?
李家崖村村地址在什么地方,想过去办事
冬天白裤子配什么衣服 鞋子 详细的 30分
经营奶粉店半途中想转行,奶粉可以退还经销商
潘多拉之心有第二季哈?
承若淡如水,谎言实如山,践行薄如云,心境飘
我腿粗,特别是小腿,冬天穿什么样的靴子不会
给我推荐800元左右的手机。时尚一点的,不要
昭贵芦荟胶去痘印效果如何?
吉达汽配地址在什么地方,想过去办事
数学题目,求最简方法
在农村现在搞养殖养什么好?
丝丝心动全集 丝丝心动全集电视剧 丝丝心动全
梦幻西游129飞升了的修和技能和155满修满技能
56级剑圣一身合成时装和套装还有加十的泰拉光
推荐资讯
It is bad (manners ) to speak with your
怎样 进入好友游戏
凯美瑞一般在行进中是放D那里还是3那里
为什么进不去CF?
请问:阿肯跟阿姆有什么关系吗?
如果手机掉线?怎么办?
靖银楼酒店在哪里啊,我有事要去这个地方
盱眙县恒生畜禽养殖专业合作社地址在哪,我要
人活着是为了吃饭还是人吃饭是为了活着?
高分!!! 关于CF战队!!!
关于图片批量修改电脑软件的问题
怎么样才能开QQ图标???
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?