VB6.0与51单片机、STM32进行串口通信
参考资料:
1.功能描述——控制LED的亮灭
(1)通过设备管理器设置端口(右击属性,端口设置—>高级),然后选择相匹配的端口
(2)运行LED控制系统.exe,点击打开串口,再点击打开按钮(向单片机发送信号1),单片机上的小灯亮起,同时界面上的灯泡变绿,最后,点击关闭按钮(向单片机发送信号2),单片机上的小灯熄灭。
2.VB上位机程序
Dim buff(0) As Byte Private Sub Command1_Click() If Command1.Caption = "打开" Then buff(0) = &H1 If (MSComm1.PortOpen = True) = True Then MSComm1.Output = buff Shape1.BackColor = RGB(0, 255, 0) Command1.Caption = "关闭" End If Else buff(0) = &H2 If (MSComm1.PortOpen = True) = True Then MSComm1.Output = buff Shape1.BackColor = RGB(222, 222, 222) Command1.Caption = "打开" End If End If End Sub Private Sub Command2_Click() If Command2.Caption = "打开串口" Then Command2.Caption = "关闭串口" Shape2.BackColor = RGB(0, 255, 0) MSComm1.CommPort = Combo1.ListIndex + 1 MSComm1.PortOpen = True Else Command2.Caption = "打开串口" Shape2.BackColor = RGB(255, 0, 0) MSComm1.PortOpen = False End If End Sub Private Sub Form_Load() Shape1.BackColor = RGB(222, 222, 222) Shape2.BackColor = RGB(255, 0, 0) Combo1.AddItem "COM1" Combo1.AddItem "COM2" Combo1.AddItem "COM3" Combo1.AddItem "COM4" Combo1.ListIndex = 0 End Sub
上位机界面:
3. 51单片机程序
#include <reg52.h> sbit led = P1^0; //LED灯定义 //对串口进行初始化 void InitUart() { SCON = 0x50; //配置串口相关寄存器 TMOD = 0x20; //配置定时器1相关寄存器 TH1 = 0xfd; //给定时器1装初值 TL1 = 0xfd; TR1 = 1; // 启动定时器1 ES = 1; // 开串口中断 EA = 1; // 开总中断 } void main(void) { InitUart(); while(1); } void Inter() interrupt 4 //串口中断处理 { if(RI==1) { RI=0; if(SBUF == 0x01) { led = 0; } if(SBUF == 0x02) { led = 1; } } }
4.STM32主程序
这里利用定时器Timer来实现判断收发数据是否完成的功能(压缩包中含有子程序)
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" int main(void) { u16 len; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 if(USART_RX_BUF[0]==0x01){ LED1=0; } if(USART_RX_BUF[0]==0x02){ LED1=1; } USART_RX_STA=0; } } }
STM32串口通信压缩包下载:
链接: 提取码:zmuz