前一段做了個序列槽通信小軟體,就是現實利用上位機軟體通過序列槽通信對下位機(單片機)通信,校時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.序列槽通信校時小軟體截圖: