天天看點

MFC序列槽通信設定及發送、中斷接收程式

       前一段做了個序列槽通信小軟體,就是現實利用上位機軟體通過序列槽通信對下位機(單片機)通信,校時LED點陣萬年曆,省去按鍵調節的麻煩,友善校時,省時省力。

為右擊 序列槽通信控件,添加關聯控件變量CMSComm m_ctrlComm;右擊 序列槽通信控件 添加該控件接收中斷消息響應處理,void CSchoolTimeDlg::OnCommMscomm1()函數,序列槽号組合框關聯控件變量,CComboBox m_SerialNumber;

1.序列槽通信設定:

m_CommNum=m_SerialNumber.GetCurSel()+1;//擷取序列槽号索引,計算序列槽号

m_ctrlComm.put_CommPort(m_CommNum);//選擇序列槽     

m_ctrlComm.put_InputMode(1);//輸入方式為二進制

m_ctrlComm.put_InBufferSize(1024);//輸入緩沖區大小為1024byte    

m_ctrlComm.put_OutBufferSize(512);//輸出緩沖區大小為512byte    

 //設定序列槽參數:9600波特率,無奇偶校驗,8個資料位,1個停止位      m_ctrlComm.put_Settings(_T("9600,n,8,1"));

if(!m_ctrlComm.get_PortOpen())

{

m_ctrlComm.put_PortOpen(1);//打開序列槽

}

//每當序列槽接收緩沖區有多餘或等于1個字元時将引發一個接收資料的oncomm事件      m_ctrlComm.put_RThreshold(1);

m_ctrlComm.put_InputLen(0);//設定目前接收區資料長度為0     

m_ctrlComm.get_Input();//預讀緩沖區以清空殘留資料

2.序列槽中斷處理函數:

       在void CSchoolTimeDlg::OnCommMscomm1()函數中添加代碼:

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048];//設定byte數組    

  CString strReceive,strTemp;//接收到的字元串,臨時字元串

if(m_ctrlComm.get_CommEvent()==2)//事件2表示接受緩沖區有字元     

{

Sleep(1000);//隻要在接收資料之前進行延時就可以,接收到完整資料

variant_inp=m_ctrlComm.get_Input();//讀緩沖區         

safearray_inp=variant_inp;//variant資料轉換成colesafearray型變量          len = safearray_inp.GetOneDimSize();//擷取一維數組元素個數

for(k=0;k<len;k++)

safearray_inp.GetElement(&k,rxdata+k);//轉換為byte型數組         

for(k=0;k<len;k++)//将數組轉換成CString型變量         

{

BYTE bt=*(char *)(rxdata+k);//字元型

strTemp.Format(L"%c",bt); //将字元送入臨時變量strTemp存放

strReceive+=strTemp;//累加接收的字元

}

3.序列槽發送代碼:

CString a;

a='D';

m_ctrlComm.put_Output((COleVariant)a);// 向序列槽發送“D”

4.序列槽通信校時小軟體截圖:

MFC序列槽通信設定及發送、中斷接收程式

繼續閱讀