前一段做了个串口通信小软件,就是现实利用上位机软件通过串口通信对下位机(单片机)通信,校时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.串口通信校时小软件截图: