[应用相关] 9-ESP8266 SDK开发基础入门篇--编写串口上位机软件

[复制链接]
 楼主| characteristic 发表于 2020-8-15 17:01 | 显示全部楼层
测试
432485f37a462e044f.png
334845f37a468c4065.png
 楼主| characteristic 发表于 2020-8-15 17:02 | 显示全部楼层
虽然可以了,但是这样写不保险...

原因是那个中断是不定长的数据就进去(受到电脑整体运行状态的影响),所以呢咱优化下
386845f37a488b3ae8.png
//串口接收到数据就会进入privatevoidserialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

        {

            intlen = serialPort1.BytesToRead;//获取可以读取的字节数if(len >0)

            {

                byte[] recvBytes =newbyte[len];//创建接收的数组serialPort1.Read(recvBytes,0, len);//接收数据for(inti =0; i < len; i++)//拷贝数据到UsartReadBuff                {

                    UsartReadBuff[i+ UsartReadCnt] = recvBytes;//从上次的地方接着填入数据                }

                UsartReadCnt = UsartReadCnt + len;//记录上次的数据个数if(UsartReadCnt >=3)//接收到可以处理的数据个数                {

                    UsartReadCnt =0;

                    if(UsartReadBuff[0] ==0xaa&& UsartReadBuff[1] ==0x55)//判断数据                    {

                        if(UsartReadBuff[2] ==0x01)//                        {

                            Invoke((newAction(() =>                            {

                                button3.Text ="熄灭";

                                label5.Text ="点亮";

                            })));

                        }

                        elseif(UsartReadBuff[2] ==0x00)

                        {

                            Invoke((newAction(() =>                            {

                                button3.Text ="点亮";

                                label5.Text ="熄灭";

                            })));

                        }

                    }

                }

            }

            //string str = serialPort1.ReadExisting();//读出来当前缓存里面的所有数据

            //Invoke((new Action(() =>

            //{

            ////显示在文本框里面

            //    textBox1.AppendText(str);

            //})));}

 楼主| characteristic 发表于 2020-8-15 17:02 | 显示全部楼层
自己测试哈

现在说一下
787555f37a4b687663.png
 楼主| characteristic 发表于 2020-8-15 17:03 | 显示全部楼层
如果接收的是字符串,想显示出来
858015f37a4ccca2ad.png
968735f37a4d3f0b6e.png
如果发过来了16进制   注意哈,发过来的是16进制  假设 00  就是数字0   因为那个文本框显示的时候是显示的字符串

所以需要转成  "00"    发过来0F   需要显示字符串形式的  "0F"

 楼主| characteristic 发表于 2020-8-15 17:04 | 显示全部楼层
给大家准备好了
  1. ///<字节数组转16进制字符串>///<param name="bytes"></param>///<returns> String 16进制显示形式</returns>publicstaticstringbyteToHexStr(byte[] bytes)

  2.         {

  3.             stringreturnStr ="";

  4.             try            {

  5.                 if(bytes !=null)

  6.                 {

  7.                     for(inti =0; i < bytes.Length; i++)

  8.                     {

  9.                         returnStr += bytes[i].ToString("X2");

  10.                         returnStr +="";//两个16进制用空格隔开,方便看数据                    }

  11.                 }

  12.                 return returnStr;

  13.             }

  14.             catch (Exception)

  15.             {

  16.                 return returnStr;

  17.             }

  18.         }

  1. //串口接收到数据就会进入privatevoidserialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

  2.         {

  3.             intlen = serialPort1.BytesToRead;//获取可以读取的字节数if(len >0)

  4.             {

  5.                 byte[] recvBytes =newbyte[len];//创建接收的数组serialPort1.Read(recvBytes,0, len);//接收数据                Invoke((newAction(() =>//显示字符串                {

  6.                     textBox1.AppendText("字符串:"+Encoding.Default.GetString(recvBytes));//显示在文本框里面                })));

  7.                 Invoke((newAction(() =>//显示16进制                {

  8.                     textBox1.AppendText("\r\n16进制:"+ byteToHexStr(recvBytes) +"\r\n");//显示在文本框里面                })));

  9.                 for(inti =0; i < len; i++)//拷贝数据到UsartReadBuff                {

  10.                     UsartReadBuff[i+ UsartReadCnt] = recvBytes[i];//从上次的地方接着填入数据                }

  11.                 UsartReadCnt = UsartReadCnt + len;//记录上次的数据个数if(UsartReadCnt >=3)//接收到可以处理的数据个数                {

  12.                     UsartReadCnt =0;

  13.                     if(UsartReadBuff[0] ==0xaa&& UsartReadBuff[1] ==0x55)//判断数据                    {

  14.                         if(UsartReadBuff[2] ==0x01)//                        {

  15.                             Invoke((newAction(() =>                            {

  16.                                 button3.Text ="熄灭";

  17.                                 label5.Text ="点亮";

  18.                             })));

  19.                         }

  20.                         elseif(UsartReadBuff[2] ==0x00)

  21.                         {

  22.                             Invoke((newAction(() =>                            {

  23.                                 button3.Text ="点亮";

  24.                                 label5.Text ="熄灭";

  25.                             })));

  26.                         }

  27.                     }

  28.                 }

  29.             }

  30.         }
 楼主| characteristic 发表于 2020-8-15 17:05 | 显示全部楼层
 楼主| characteristic 发表于 2020-8-15 17:05 | 显示全部楼层
现在看发送

发送就只做字符串发送哈,,,16进制发送后期补上,,大家先吸收吸收现在的....
995915f37a5591346f.png
282905f37a56092362.png
808645f37a566967ec.png
580375f37a56cbe68d.png
 楼主| characteristic 发表于 2020-8-15 17:06 | 显示全部楼层
执行文件
834335f37a57ee6406.png
 楼主| characteristic 发表于 2020-8-15 17:06 | 显示全部楼层
我把16进制发送用到的函数放在这里,后期再回来加上

  1. ///<字符串转16进制格式,不够自动前面补零>//////</summary>///<param name="hexString"></param>///<returns></returns>privatestaticbyte[] strToToHexByte(String hexString)

  2.         {

  3.             int i;

  4.             boolFlag =false;

  5.             hexString = hexString.Replace("","");//清除空格if((hexString.Length %2) !=0)

  6.             {

  7.                 Flag =true;

  8.             }

  9.             if(Flag ==true)

  10.             {

  11.                 byte[] returnBytes =newbyte[(hexString.Length +1) /2];

  12.                 try                {

  13.                     for(i =0; i < (hexString.Length -1) /2; i++)

  14.                     {

  15.                         returnBytes[i] = Convert.ToByte(hexString.Substring(i *2,2),16);

  16.                     }

  17.                     returnBytes[returnBytes.Length -1] = Convert.ToByte(hexString.Substring(hexString.Length -1,1).PadLeft(2,'0'),16);

  18.                 }

  19.                 catch                {

  20.                     for(i =0; i < returnBytes.Length; i++)

  21.                     {

  22.                         returnBytes[i] =0;

  23.                     }

  24.                     MessageBox.Show("超过16进制范围A-F,已初始化为0","提示");

  25.                 }

  26.                 return returnBytes;

  27.             }

  28.             else            {

  29.                 byte[] returnBytes =newbyte[(hexString.Length) /2];

  30.                 try                {

  31.                     for(i =0; i < returnBytes.Length; i++)

  32.                     {

  33.                         returnBytes[i] = Convert.ToByte(hexString.Substring(i *2,2),16);

  34.                     }

  35.                 }

  36.                 catch                {

  37.                     for(i =0; i < returnBytes.Length; i++)

  38.                     {

  39.                         returnBytes[i] =0;

  40.                     }

  41.                     MessageBox.Show("超过16进制范围A-F,已初始化为0","提示");

  42.                 }

  43.                 return returnBytes;

  44.             }

  45.         }
 楼主| characteristic 发表于 2020-8-15 17:07 | 显示全部楼层
对了,其实上位机串口是有空闲时间中断的(异常捕获),只不过,我还没细研究呢!!!



https://www.cnblogs.com/yangfengwu/p/11094009.html
 楼主| characteristic 发表于 2020-8-15 17:07 | 显示全部楼层

作者:杨奉武
链接:https://www.jianshu.com/p/29ff8dcef4d9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部