假设我想COM1发送了一个数据,我怎么写才能读取那个数据呢?用C语言。
读取以后我怎么回发一个数据呢?
假设我想COM1发送了一个数据,我怎么写才能读取那个数据呢?用C语言。
读取以后我怎么回发一个数据呢?
可以使用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