ESP8266 SDK开发: 综合篇-C#上位机串口通信控制ESP8266
2021-03-17 14:26
标签:定时 通过 添加 sele scroll tick 方法 i++ 程序 1.C#串口上位机通过串口控制继电器 控制继电器吸合 控制继电器断开 1,请用户先学习这一节 https://www.cnblogs.com/yangfengwu/p/12382103.html 编写C#串口调试助手 2.控制继电器引脚
上位机串口发送给ESP8266控制继电器吸合指令: 0xaa 0x55 0x01 0x01 ESP8266执行以后回复: 0x55 0xaa 0x01 0x01 上位机串口发送给ESP8266控制继电器断开指令: 0xaa 0x55 0x01 0x00 ESP8266执行以后回复: 0x55 0xaa 0x01 0x00 1.处理程序在这节的基础上添加 https://www.cnblogs.com/yangfengwu/p/12375342.html 2.配置GPIO5为普通引脚
3.定义用于返回继电器状态的数组 4.编写处理程序
5.先用串口调试助手测试
控制继电器吸合 aa 55 01 01
控制继电器断开 aa 55 01 00
1.上位机只保留了这一节 https://www.cnblogs.com/yangfengwu/p/12382103.html 操作串口部分
详细保留的程序说明: 1.串口显示初始化
2.打开关闭串口
3.串口热插拔检测
4.串口接收
1.页面 两个Label 一个按键
2.双击 吸合按钮 生成按钮点击事件 并在点击事件中编写以下程序 3.编写串口接收处理程序 处理思路: https://www.cnblogs.com/yangfengwu/p/11669373.html 3.1.拖拽上来一个定时器
3.2配置定时器 Enable改为True (使能定时器) Interval 设置为1 (1Ms进一次)
3.3 选择事件 -> 双击Tick 让程序生成定时器回调函数
3.4 定义用于处理串口数据的变量
3.5 串口中断函数中处理程序如下
3.6 定时器中断函数程序如下
1.控制继电器吸合
2.控制继电器断开
ESP8266 SDK开发: 综合篇-C#上位机串口通信控制ESP8266 标签:定时 通过 添加 sele scroll tick 方法 i++ 程序 原文地址:https://www.cnblogs.com/yangfengwu/p/12386915.html实现的功能
说明
协议规定
ESP8266程序编写
/*设置GPIO5为普通引脚*/
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);
/*用于返回继电器的状态*/
u8 RelayOn[4]={0x55,0xaa,0x01,0x01};//继电器吸合
u8 RelayOff[4]={0x55,0xaa,0x01,0x00};//继电器断开
if(Usart0ReadBuff[0] == 0xaa && Usart0ReadBuff[1] == 0x55){
if(Usart0ReadBuff[2] == 0x01){
if(Usart0ReadBuff[3] == 0x01){
GPIO_OUTPUT_SET(5, 1);//设置GPIO5输出高电平
for(i=0;i4;i++){
uart_tx_one_char(UART0,RelayOn[i]);//返回吸合指令
}
}
else if(Usart0ReadBuff[3] == 0x00){
GPIO_OUTPUT_SET(5, 0);//设置GPIO5输出低电平
for(i=0;i4;i++){
uart_tx_one_char(UART0,RelayOff[i]);//返回断开指令
}
}
}
}
C#上位机程序编写
开始编写
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) { }
byte[] UsartReadBuff = new byte[1024];//接收数据缓存
int UsartReadCnt = 0;//串口接收的数据个数
int UsartReadCntCopy = 0;//用于拷贝串口接收的数据个数
int UsartIdleCnt = 0;//空闲时间累加变量
int len = serialPort1.BytesToRead;//获取可以读取的字节数
if ((UsartReadCnt + len) 1024)//待接收的数据不得超出数组大小
{
//把数据读取到UsartReadBuff数组,每次接收数据偏移UsartReadCnt
serialPort1.Read(UsartReadBuff, UsartReadCnt, len);
UsartReadCnt = UsartReadCnt + len;
}
else
{
UsartReadCnt = 0;
}
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 = "吸合";
}
}
}
}
}
启动测试
文章标题:ESP8266 SDK开发: 综合篇-C#上位机串口通信控制ESP8266
文章链接:http://soscw.com/index.php/essay/65347.html