发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[STM32]

Visual Studio 2019 +STM32实现串口通讯详解

[复制链接]
3506|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 刘东君 于 2021-3-18 16:47 编辑

#申请原创# @21小跑堂
1.下载 免费版 Visual Studio 2019 并进行安装 https://visualstudio.microsoft.com/zh-hans/

2.双击软件创建项目



3.选择Windows窗体应用程序(.NET Framework)创建项目。



4.项目创建完成,初始界面。



5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。



6.开完会了继续编辑,(●'◡'●)
7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。

8.双击串口模块,添加数据接收中断函数

9.添加按钮模块,控制STM32开发板LED灯的亮灭。

10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:
       //串口通讯命令
        public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验  00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器
        // 串口接收
        public static byte[] revcmd = new byte[3];


11. 开灯LED0程序如下:
        private void button1_Click(object sender, EventArgs e)  //开灯LED0
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
                serialPort1.Open();  //打开串口
                serialPort1.DiscardInBuffer();//清空缓冲区数据
                SendOrder[1] = 0x01;//发送开灯命令
                serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
            }
            catch
            {
                MessageBox.Show("请检查串口1是否打开");
            }
        }


12.关灯LED0程序如下:
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
                serialPort1.Open();  //打开串口
                serialPort1.DiscardInBuffer();//清空缓冲区数据
                SendOrder[1] = 0x00;//发送开灯命令
                serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
            }
            catch
            {
                MessageBox.Show("请检查串口1是否打开");
            }
        }

13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)

14.串口接收函数如下:
       private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
        {
            try
            {
                serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd

            }
            catch
            {
                MessageBox.Show("请检查串口1是否打开");
            }
            this.Invoke(new EventHandler(ComService)); //调用事件处理函数
        }

15.串口接收数据处理函数如下:
        private void ComService(object sender, EventArgs e)
        {
            if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))
            {
                button5.Text = "灯开了";
                button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色
               // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为

            }
            if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))
            {
                button5.Text = "灯关了";
                button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
            }
        }

16.上位机程序编写完成。附件如下:

VS2019_STM32串口通信.rar (41.29 KB)

17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)

void USART1_IRQHandler(void)//串口1中断服务程序
{           
        u8 res;        
                USART1_StartFlag=1;        
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除               
                if(USART1_RX_CNT<100)
                {
                        USART1_RX_BUFF[USART1_RX_CNT]=res;
                        USART1_RX_CNT++;

                        TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断
                        TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)
                        TIM_Cmd(TIM7,ENABLE);//开始计时
                }
        }
}

/////////////////////////////////////////////////////////////////////////////////////        
//串口服务函数
void USART1RX_Service(void)
{
                if(USART1_FrameFlag==1)
                {
                                USART1_StartFlag=0;
                            USART1_FrameFlag=0;        //复位帧结束标志
                                USART1_RX_CNT=0;//接收计数器清零
                                if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5))  //通讯测试  5A  00  A5
                                {
                                                SendBUF[0]=0x5A;
                                            SendBUF[1]=0x00;
                                            SendBUF[2]=0xA5;
                                            LED0=1;
                                            USART1_SendData(SendBUF,3);
                                       
                                }
                                if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5))  //通讯测试  5A  00  A5
                                {
                                                SendBUF[0]=0x5A;
                                            SendBUF[1]=0x01;
                                            SendBUF[2]=0xA5;
                                            LED0=0;
                                            USART1_SendData(SendBUF,3);
                                       
                                }
                                
                }
}


18.单片机程序直接附上:
VS2019_STM32通讯实验.rar (2.43 MB)

19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图:
或者更改VS2019中串口模块的属性,如下:

20.下面发给小视频演示下效果:
VS2019_STM32视频.rar (2.05 MB)
21.好的完成了,谢谢大家。






使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2021-03-19
理由:恭喜通过原创文章审核!请多多加油哦!

评论
Altiumhu 2021-3-19 08:21 回复TA
牛B,谢谢分享 
刘东君 2021-3-18 16:17 回复TA
@zhengfish :有的 
zhengfish 2021-3-18 10:59 回复TA
看图.NET有控件支持串口访问? 
21小跑堂 2021-3-18 09:25 回复TA
静静等待您此文的后续。。。 

相关帖子

沙发
123654789| | 2021-3-18 09:07 | 只看该作者
程序呢  ??

使用特权

评论回复
板凳
刘东君|  楼主 | 2021-3-18 09:14 | 只看该作者

正在写着呢。。。。

使用特权

评论回复
地板
taobaofarmer| | 2021-3-18 09:24 | 只看该作者
VS2019有串口类吗?

使用特权

评论回复
5
刘东君|  楼主 | 2021-3-18 09:41 | 只看该作者

有的 ,我正在写

使用特权

评论回复
6
bbschen| | 2021-3-18 10:18 | 只看该作者
看看

使用特权

评论回复
7
lcfmax| | 2021-3-18 14:08 | 只看该作者
谢谢分享,继续

使用特权

评论回复
8
strang| | 2021-3-18 14:56 | 只看该作者
哈哈,看看

使用特权

评论回复
9
ankerd| | 2021-3-18 15:53 | 只看该作者
感觉这是在线直播

使用特权

评论回复
10
taobaofarmer| | 2021-3-18 16:33 | 只看该作者

你说的这个串口类,是原来VC6上的MSCOMM控件吧?

使用特权

评论回复
11
icecut| | 2021-3-18 17:27 | 只看该作者
恩. dotnet 还是个不错的选择.
不过我准备用flutter搞一个试试

使用特权

评论回复
12
ranjiang801| | 2021-3-20 11:30 | 只看该作者
厉害

使用特权

评论回复
13
trucyw| | 2021-4-9 09:35 | 只看该作者
厉害

使用特权

评论回复
14
lgwd| | 2021-4-9 22:26 | 只看该作者
因为目前的中美关系,微软已经停止对大陆VS2019的下载了。

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

163

主题

1076

帖子

7

粉丝