串口发送数据

S  串口编程 详解4 串口发送数据

串口发送数据包括:

十六进制发送数据

手动发送数据

自动发送数据


手动发送数据的代码如下:

[cpp]  view plain  copy
  1. //手动发送  
  2. long TX_count=0;  
  3. void CSCOMMDlg::OnButtonManualsend()   
  4. {  
  5.     if(m_Port.m_hComm==NULL)//发送数据时要检查串口是否被打开  
  6.     {  
  7.         m_ctrlAutoSend.SetCheck(0);  
  8.         AfxMessageBox("串口没有打开,请打开串口");  
  9.         return ;  
  10.     }  
  11.     else  
  12.     {  
  13.         UpdateData(TRUE);  
  14.         if(m_ctrlHexSend.GetCheck())//发送十六进制数  
  15.         {         
  16.             char data[512];       
  17.             int len=Str2Hex(m_strSendData,data);//将一个字符串转换为十六进制数 发送  
  18.             m_Port.WriteToPort(data,len);  
  19.             //for(int i=0;i<len;i++)  测试用  
  20.             //  OnCommunication(data[i],1);  
  21.             TX_count+=(long)((m_strSendData.GetLength()+1)/3);//?????????????  
  22.         }  
  23.         else//发送ASCII文本  
  24.         {  
  25.             m_Port.WriteToPort((LPCTSTR)m_strSendData);//发送数据  
  26.                 char data[512];  
  27.       
  28.             strcpy(data,m_strSendData);  
  29.             int len=m_strSendData.GetLength();  
  30.             for(int i=0;i<len;i++)  
  31.                 OnCommunication(data[i],1);  
  32.             TX_count+=m_strSendData.GetLength();  
  33.         }  
  34.         CString strTemp;  
  35.         strTemp.Format("TX: %d",TX_count);  
  36.         m_ctrlTXCount.SetWindowText(strTemp);//显示计数       
  37.     //  WPARAM ch='a';       //测试用  
  38.     //  OnCommunication(ch,1);    
  39.     }     
  40.           CFile m_rFile;  
  41.           //LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以NULL(‘\0’)结尾的常量字符的指针。  
  42.           LPCSTR lpszPath=m_StrCurPath;// "C:\\comdata"  
  43.           SetCurrentDirectory(lpszPath);            
  44. }  
代码分析:

发送数据是很简单的,只用了 m_Port.WriteToPort(data,len);就够啦。

这里也涉及到是否是十六进制发送数据,如果是 则先把十六进制转换为字符再进行发送,转换得调用Str2Hex( )函数。 其实这个函数名为HexToStr( )更合适

[cpp]  view plain  copy
  1. //将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔  
  2. //返回转换后的字节数组长度,同时字节数组长度自动设置  
  3. //将 一串十六进制数转换为字符串(原理:两个十六进制数转化为一个字符  )  
  4. int CSCOMMDlg::Str2Hex(CString str, char *data)  
  5. {  
  6.     int t,t1;  
  7.     int rlen=0,len=str.GetLength();  
  8.   
  9.     for (int i=0;i<len;)  
  10.     {  
  11.         char l,h=str[i];//高位  
  12.   
  13.         if(h==' ')  
  14.         {  
  15.             i++;  
  16.             continue;  
  17.         }  
  18.   
  19.         i++;  
  20.         if(i>=len)  
  21.             break;  
  22.   
  23.         l=str[i];//低位  
  24.         t=HexChar(h);  
  25.         t1=HexChar(l);  
  26.   
  27.         if((t==16)||(t1==16))  
  28.             break;  
  29.         else  
  30.             t=t*16+t1;  //把两位的十六进制数转换为一个字符  
  31.         i++;  
  32.         data[rlen]=(char)t;  
  33.         rlen++;  
  34.     }  
  35.     return rlen;  
  36. }  
[cpp]  view plain  copy
  1. char CSCOMMDlg::HexChar(char c)  
  2. {  
  3.     if((c>='0')&&(c<='9'))  
  4.         return c-0x30;  
  5.     else if((c>='A')&&(c<='F'))  
  6.         return c-'A'+10;  
  7.     else if((c>'a')&&(c<'f'))  
  8.         return c-'a'+10;  
  9.     else   
  10.         return 0x10;  
  11. }  


自动发送处理

如果选择了自动发送,则应该使用定时器来实现自动周期性地发送的功能,代码如下

选择自动发送按钮的代码,为IDC_CHECK_AUTOSEND添加处理函数如下

[cpp]  view plain  copy
  1. void CSCOMMDlg::OnCheckAutosend()   
  2. {  
  3.     m_bAutoSend=!m_bAutoSend;  
  4.     if(m_bAutoSend)  
  5.     {  
  6.         if(m_Port.m_hComm==NULL)  
  7.         {  
  8.             m_bAutoSend=!m_bAutoSend;  
  9.             m_ctrlAutoSend.SetCheck(0);  
  10.             AfxMessageBox("串口没打开,请打开串口");  
  11.             return ;  
  12.         }  
  13.         else  
  14.             SetTimer(1,m_nCycleTime,NULL);  
  15.     }  
  16.     else  
  17.     {  
  18.         KillTimer(1);//杀掉定时器1  
  19.     }  
  20. }  

定时器代码

[cpp]  view plain  copy
  1. void CSCOMMDlg::OnTimer(UINT nIDEvent)   
  2. {  
  3.     switch (nIDEvent)  
  4.     {  
  5.     case 1: //定时器ID==1为自动发送时间  
  6.         OnButtonManualsend();   //周期到后自动发送  
  7.         break;  
  8.     default:  
  9.         break;  
  10.     }  
  11.     CDialog::OnTimer(nIDEvent);  
  12. }  

当然也要考虑,当发送输入的编辑框中的内容改变时,应及时将串口发送的内容改变,因此应为编辑框IDC_EDIT_SEND添加EN_CHANCE相应函数。这个我是想不全的。

[cpp]  view plain  copy
  1. void CSCOMMDlg::OnChangeEditSend()   
  2. {  
  3.     UpdateData(TRUE);  
  4. }  

与此同时,如果发送周期改变时,应该重新用设置定时时间

[cpp]  view plain  copy
  1. void CSCOMMDlg::OnChangeEditCycletime()   
  2. {  
  3.     CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_CYCLETIME);  
  4.     CString strText;  
  5.     pEdit->GetWindowText(strText);  
  6.     m_nCycleTime=atoi(strText);  
  7. }  
以上的代码理解和使用应该都不是些什么问题
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值