|  | 
 
| 
 
 
 
 实现的功能
 1.C#串口上位机通过串口控制继电器 
 
 
 控制继电器吸合 
 
 
 
 控制继电器断开 
 
 
 
 
 
 
 说明
 1,请用户先学习这一节 
 
 2.控制继电器引脚 
 
 
 
 
 协议规定
 
 上位机串口发送给ESP8266控制继电器吸合指令: 0xaa  0x55  0x01 0x01 ESP8266执行以后回复: 0x55  0xaa  0x01 0x01 
 
 上位机串口发送给ESP8266控制继电器断开指令: 0xaa  0x55  0x01 0x00 ESP8266执行以后回复: 0x55  0xaa  0x01 0x00 
 
 ESP8266程序编写
 1.处理程序在这节的基础上添加 
 
 2.配置GPIO5为普通引脚 
 
 
 /*设置GPIO5为普通引脚*/
 
 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);
 
 
 
 3.定义用于返回继电器状态的数组 
 /*用于返回继电器的状态*/
 u8 RelayOn[4]={0x55,0xaa,0x01,0x01};//继电器吸合
 u8 RelayOff[4]={0x55,0xaa,0x01,0x00};//继电器断开
 
 
 
 4.编写处理程序 
 
 
 if(Usart0ReadBuff[0] == 0xaa && Usart0ReadBuff[1] == 0x55){
 if(Usart0ReadBuff[2] == 0x01){
 if(Usart0ReadBuff[3] == 0x01){
 GPIO_OUTPUT_SET(5, 1);//设置GPIO5输出高电平
 for(i=0;i<4;i++){
 uart_tx_one_char(UART0,RelayOn);//返回吸合指令
 }
 }
 else if(Usart0ReadBuff[3] == 0x00){
 GPIO_OUTPUT_SET(5, 0);//设置GPIO5输出低电平
 for(i=0;i<4;i++){
 uart_tx_one_char(UART0,RelayOff);//返回断开指令
 }
 }
 }
 }
 
 
 
 5.先用串口调试助手测试 
 
 控制继电器吸合 
 aa  55  01 01 
 
 
 
 
 
 
 
 控制继电器断开 aa  55  01 00 
 
 
 
 
 
 
 C#上位机程序编写
 1.上位机只保留了这一节 
 操作串口部分 
 
 
 
 详细保留的程序说明: 1.串口显示初始化 
 
 
 
 
 
 
 2.打开关闭串口 
 
 
 
 3.串口热插拔检测 
 
 
 
 4.串口接收 开始编写
 1.页面 两个Label  一个按键 
 
 
 
 
 2.双击 吸合按钮 生成按钮点击事件 并在点击事件中编写以下程序 
 byte[] SendData = new byte[4];
 SendData[0] = 0xaa;
 SendData[1] = 0x55;
 SendData[2] = 0x01;
 SendData[3] = 0x01;
 if (button2.Text == "吸合")
 {
 SendData[3] = 0x01;
 }
 else if (button2.Text == "断开")
 {
 SendData[3] = 0x00;
 }
 try
 {
 serialPort1.Write(SendData, 0, SendData.Length);
 }
 catch (Exception) { }
 
 
 
 
 3.编写串口接收处理程序 
 
 3.1.拖拽上来一个定时器 
 
 
 
 3.2配置定时器 Enable改为True  (使能定时器) Interval 设置为1  (1Ms进一次) 
 
 
 
 
 
 
 
 3.3  选择事件 -> 双击Tick  让程序生成定时器回调函数 
 
 
 
 
 
 
 
 
 3.4 定义用于处理串口数据的变量 
 
 byte[] UsartReadBuff = new byte[1024];//接收数据缓存
 int UsartReadCnt = 0;//串口接收的数据个数
 int UsartReadCntCopy = 0;//用于拷贝串口接收的数据个数
 int UsartIdleCnt = 0;//空闲时间累加变量
 
 
 
 3.5 串口中断函数中处理程序如下 
 int len = serialPort1.BytesToRead;//获取可以读取的字节数
 if ((UsartReadCnt + len) < 1024)//待接收的数据不得超出数组大小
 {
 //把数据读取到UsartReadBuff数组,每次接收数据偏移UsartReadCnt
 serialPort1.Read(UsartReadBuff, UsartReadCnt, len);
 UsartReadCnt = UsartReadCnt + len;
 }
 else
 {
 UsartReadCnt = 0;
 }
 
 
 
 3.6 定时器中断函数程序如下 
 
 if (UsartReadCnt!=0)//串口接收到数据
 {
 UsartIdleCnt++;//空闲变量累加
 if (UsartIdleCnt > 10)//串口超过10ms没有接收数据
 {
 UsartIdleCnt = 0;
 UsartReadCntCopy = UsartReadCnt;
 UsartReadCnt = 0;
 
 if (UsartReadBuff[0] == 0x55 && UsartReadBuff[1] == 0xaa)
 {
 if (UsartReadBuff[2] == 0x01)
 {
 if (UsartReadBuff[3] == 0x01)//继电器吸合
 {
 Invoke((new Action(() => {//C# 3.0以后代替委托的新方法
 label8.Text = "吸合";
 button2.Text = "断开";
 })));
 }
 else if (UsartReadBuff[3] == 0x00)//继电器断开
 {
 label8.Text = "断开";
 button2.Text = "吸合";
 }
 }
 }
 }
 }
 
 启动测试
 1.控制继电器吸合      
 
 
 
 
 
 
 
 
 
 2.控制继电器断开      
 
 
 
 
 
 
 
 | 
 
  |