【如何编写串口类?】
【怎么编写串口类???】
只会用,没用写过串口类,我想自己编写一个类,请问怎么编写一个串口类,需要哪些步骤和函数?
------解决思路----------------------
研究透彻CreateFile,ReadFile,WriteFile
------解决思路----------------------
搜串口助手就应该有 还有一个cncomm也有完整源代码http://blog.****.net/wujian53/article/details/4090554
------解决思路----------------------
MSDN上搜索Communications Functions
------解决思路----------------------
mscomm
------解决思路----------------------
这个网上应该有很成熟的方案了,去找找参考
------解决思路----------------------
打开串口:
m_mscomm.put_CommPort("com1"); //选择COM1
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm
m_mscomm.put_Settings("128000,n,8,1");
if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox((Com+"打开成功"));
}
else
{m_mscomm.put_OutBufferCount(0);
AfxMessageBox((Com+"打开失败"));
}
当数据到来时触发OnCommMscomm1(需要添加串口控件 添加消息响应)
// TODO: Add your message handler code here
static unsigned int cnt=0;
VARIANT variant_inp; COleSafeArray safearray_inp; long len,k;
unsigned int data[99999]={0};
byte rxdata[99999]; //设置 BYTE 数组
CString strtemp,strtemp2;
if(m_mscomm.get_CommEvent()==2)
{ cnt++;
variant_inp=m_mscomm.get_Input(); //读缓冲区消息
safearray_inp=variant_inp; ///变量转换
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
{safearray_inp.GetElement(&k,rxdata+k);}
for(k=0;k<len;k++)
{
strtemp.Format(_T("%x"),*(rxdata+k));//接受成10进制的数据
BYTE bt=*(char*)(rxdata+k);
strtemp2.Format("%c",bt);//接受成16进制的数据对应的ascII码
------解决思路----------------------
建立一个通信线程,例如:
再建立一个事件线程,接收发送、接收事件。
与主线程间使用消息交换数据。
------解决思路----------------------
"带流控制的串口通讯程序.rar"
http://download.****.net/detail/schlafenhamster/4195462
只会用,没用写过串口类,我想自己编写一个类,请问怎么编写一个串口类,需要哪些步骤和函数?
------解决思路----------------------
研究透彻CreateFile,ReadFile,WriteFile
------解决思路----------------------
搜串口助手就应该有 还有一个cncomm也有完整源代码http://blog.****.net/wujian53/article/details/4090554
------解决思路----------------------
MSDN上搜索Communications Functions
------解决思路----------------------
mscomm
------解决思路----------------------
这个网上应该有很成熟的方案了,去找找参考
------解决思路----------------------
打开串口:
m_mscomm.put_CommPort("com1"); //选择COM1
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm
m_mscomm.put_Settings("128000,n,8,1");
if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox((Com+"打开成功"));
}
else
{m_mscomm.put_OutBufferCount(0);
AfxMessageBox((Com+"打开失败"));
}
当数据到来时触发OnCommMscomm1(需要添加串口控件 添加消息响应)
// TODO: Add your message handler code here
static unsigned int cnt=0;
VARIANT variant_inp; COleSafeArray safearray_inp; long len,k;
unsigned int data[99999]={0};
byte rxdata[99999]; //设置 BYTE 数组
CString strtemp,strtemp2;
if(m_mscomm.get_CommEvent()==2)
{ cnt++;
variant_inp=m_mscomm.get_Input(); //读缓冲区消息
safearray_inp=variant_inp; ///变量转换
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
{safearray_inp.GetElement(&k,rxdata+k);}
for(k=0;k<len;k++)
{
strtemp.Format(_T("%x"),*(rxdata+k));//接受成10进制的数据
BYTE bt=*(char*)(rxdata+k);
strtemp2.Format("%c",bt);//接受成16进制的数据对应的ascII码
------解决思路----------------------
建立一个通信线程,例如:
class CCommThread : public CWinThread
{
DECLARE_DYNCREATE(CCommThread)
protected:
CCommThread(); // 动态创建所使用的受保护的构造函数
virtual ~CCommThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnCommMessag(WPARAM wParam,LPARAM lParam); // 收到数据的消息
afx_msg void OnRsControlMessag(WPARAM wParam,LPARAM lParam); // 收到控制消息
// 消息捕获
virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
// 事件线程已经启动
static bool fEvent;
// 主控窗口指针
CWnd* m_pMain;
// 串行口参数结构
PORT_PARAM m_sPortParam;
// 发送缓冲区满
bool isSendBufull;
// 检查发送定时器
UINT m_resendID;
// 未发送数据缓冲区
byte m_pSendBuff[OUT_BUFF_SIZE];
// 未发送数据长度
int m_sendBufLen;
// 建立连接
void NetConnect(void);
// 关闭通信口
void ClosePort(void);
// 压入发送数据
void PushSendDatas(byte* pd,int len);
// 发送数据
void SendData(void);
// 接收数据
void ReceiveData(void);
// 错误报告
void ErrorProc(byte error);
// 向上报告
void ReportUp(byte cmd,byte* pdata=NULL,int len=0);
// 删除定时器
void KillMyTimer(UINT &timeID);
// 设置定时器
void SetMyTimer(UINT &timeID,UINT time);
// 弹出到UDP
void PopToUdp(byte* pdata,int len,BOOL isSend=false,int port=3030);
};
再建立一个事件线程,接收发送、接收事件。
与主线程间使用消息交换数据。
------解决思路----------------------
"带流控制的串口通讯程序.rar"
http://download.****.net/detail/schlafenhamster/4195462