《单片机串口通信及测控应用实战详解》——6.3 PC端程序设计

    xiaoxiao2024-03-14  17

    本节书摘来自异步社区《单片机串口通信及测控应用实战详解》一书中的第6章,第6.3节,作者 李江全,聂晶,梁习卉子,刘新英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    6.3 PC端程序设计

    6.3.1 采用Visual Basic实现

    1.程序界面设计

    运行VB 6.0,创建标准的工程项目文件,设计程序窗体。

    (1)添加1个MSComm控件用于实现PC与单片机串口通信。

    (2)添加2个按钮控件CommandButton,用于输出指令和关闭程序。

    (3)添加3个文本控件TextBox,用于输入单片机地址、继电器状态和返回数据。

    (4)添加5个标签控件Label,用于显示文本框功能等。

    2.属性设置

    程序窗体、控件对象的主要属性设置如表6-2所示。

    设计的程序界面如图6-4所示。

    3.编写程序代码

    以下是实现PC与多个单片机串口通信的Visual Basic程序。

    'PC发送数据01 11,表示01号单片机板继电器1和2打开 'PC发送数据01 00,表示01号单片机板继电器1和2关闭 'PC发送数据02 01,表示02号单片机板继电器1关闭,继电器2打开 'PC发送数据02 10,表示02号单片机板继电器1打开,继电器2关闭 '初始化串口 Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.InputMode = 1 MSComm1.SThreshold = 1 MSComm1.RThreshold = 1 MSComm1.PortOpen = True End Sub '状态输出 Private Sub Cmdout_Click() Dim uout1 As Variant     '单片机地址号 Dim uout2 As Variant     '单片机继电器状态值 uout1 = "&H" & Val(addrText.Text) uout2 = "&H" & Val(dataText.Text) MSComm1.Output = Chr(uout1) & Chr(uout2) '将十六进制数据值发送给单片机 End Sub '返回数据 Private Sub MSComm1_OnComm() Dim Inbyte() As Byte Dim buffer As String Dim strdata(10) As String Dim datanum As String Select Case MSComm1.CommEvent Case comEvReceive Inbyte = MSComm1.Input     '读取单片机返回的数据串 For i = LBound(Inbyte) To UBound(Inbyte) buffer = buffer + Hex(Inbyte(i)) + Chr(32)   '获得单片机返回数据串 Next i Case comEvSend End Select For jj = 1 To 6 strdata(jj) = Mid(Trim(buffer), jj, 1)   '从数据串中逐个取位 Next jj If Len(Trim(buffer)) = 3 Then datanum = "0" & strdata(1) & strdata(2) & "0" & strdata(3) End If If Len(Trim(buffer)) = 4 Then datanum = "0" & strdata(1) & strdata(2) & strdata(3) & strdata(4) End If receiveText.Text = datanum '显示单片机返回的数据串 End Sub '关闭程序 Private Sub Cmdexit_Click() MSComm1.PortOpen = False Unload Me End Sub

    4.运行程序

    程序设计、调试完毕后,运行程序。

    PC通过串行口将十六进制数发送给多个单片机,驱动地址吻合的单片机继电器动作,并在数码管显示接收的数。单片机接收到数据后,返回原数据给PC。

    如PC发送十六进制数据“01 11”,驱动1号单片机板继电器1和2打开,单片机返回十六进制数据“01 11”。

    程序运行界面如图6-5所示。

    6.3.2 采用Visual C++实现

    1.程序界面设计

    程序界面设计与VB多单片机通信基本相同。设计的程序界面如图6-6所示。

    2.编写程序代码

    以下是实现PC与多个单片机串口通信的VC++参考程序。

    #include "stdafx.h" #include "mcu.h" #include "mcuDlg.h" //串口初始化设置 BOOL CMcuDlg::OnInitDialog() {   m_Comm.SetCommPort(1); //选择COM1   m_Comm.SetInputMode(1); //输入方式为二进制方式       m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件   m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件   m_Comm.SetSettings("9600,n,8,1");   m_Comm.SetPortOpen(TRUE);//打开串口   return TRUE; } //发送数据 void CMcuDlg::OnOK() {   CByteArray data;   CString a,b;   int len;   UpdateData(TRUE); //读编辑框内容   len = Str2Hex(m_address+m_data,data);   m_Comm.SetOutput(COleVariant(data));   } //接受返回数据 void CMcuDlg::OnOnCommMscomm1() {   VARIANT data;   COleSafeArray data2;   CByteArray datatemp;   LONG k = 0;   BYTE Inbyte[2]; //设置BYTE数组   CString strtemp;     if(m_Comm.GetCommEvent() = = 2) //事件值为2表示接收缓冲区内有字符   {     data = m_Comm.GetInput(); //读缓冲区    data2 = data; //VARIANT型变量转换为ColeSafeArray型变量     data2.GetElement(&k,&Inbyte[0]);//获取回传数据,前两个字节     k++;     data2.GetElement(&k,&Inbyte[1]);   }   strtemp.Format("%s %s",HexChar(Inbyte[0]),HexChar(Inbyte[1]));   m_receive = strtemp;   UpdateData(false); } //十六进制转为字符串 char* CMcuDlg::HexChar(BYTE idata) { char *temp = new char[3];   char a,b;   temp[2] = '\0';   a = idata>>4;   b = idata&0x0f;   if(a<9)     temp[0] = (a+48);   else     temp[0] = (a+55);   if(b<9)     temp[1] = (b+48);   else     temp[1] = (b+55);   return temp;   } //将字符转换十六进制 char CMcuDlg::HexChar(char c) {   if((c> = '0')&&(c< = '9'))     return c-0x30;   else if((c> = 'A')&&(c< = 'F'))     return c-'A'+10;   else if((c> = 'a')&&(c< = 'f'))     return c-'a'+10;   else     return -1; } //把字符串转换为十六进制 int CMcuDlg::Str2Hex(CString str, CByteArray &senddata) {   int hexdata,lowhexdata;   int hexdatalen = 0;   int len = str.GetLength();   senddata.SetSize(len/2);   for(int i = 0;i<len;)   {     char lstr,hstr = str[i];     if(hstr = = ' ')     {       i++;       continue;     }     i++;     if(i> = len)       break;     lstr = str[i];     hexdata = HexChar(hstr); //高位转换     lowhexdata = HexChar(lstr); //低位转换     if((hexdata = = 16)||(lowhexdata = = 16))       break;     else       hexdata = hexdata*16+lowhexdata;     i++;     senddata[hexdatalen] = (char)hexdata;     hexdatalen++;   }   return hexdatalen; } //关闭串口退出程序 void CMcuDlg::OnCancel() {   m_Comm.SetPortOpen(false);//关闭串口   CDialog::OnCancel(); }

    3.运行程序

    程序设计、调试完毕,运行程序。

    PC通过串行口将十六进制数发送给多个单片机,驱动地址吻合的单片机继电器动作,并在数码管显示接收的数。单片机接收到数据后,返回原数据给PC。

    如PC发送十六进制数据“02 11”,驱动2号单片机板继电器1和2打开,单片机返回十六进制数据“0211”。

    程序运行界面如图6-7所示。

    相关资源:单片机数据通信及测控应用技术详解
    最新回复(0)