2018-05-02 22:11:29 dok12 阅读数 10654
  • 串口通信和RS485-第1季第13部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第13个课程,主要讲解了串行通信UART及其扩展RS485。本课程很重要,因为串口通信是我们接触的早也简单的通信方式,是后续继续学习SPI、I2C甚至USB、网络通信等的基础,大家务必认证对待完全掌握。

    6011 人正在学习 去看看 朱有鹏

打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机烧录软件,蓝牙通讯软件APP。软件基本上都是免安装直接运行的。

工作流程简单总结下为以下3步:
1.利用单片机小精灵软件,做好烧录程序,确定波特率应该设置为2400
2.hc-06蓝牙模块进入AT模式,串口通讯助手成功将蓝牙模块波特率设置为2400
3.将烧录程序通过keil编译成功后烧录至单片机实验板上,手机上安装好APP,设置完成后运行,确定成功。

步骤(2)见


https://blog.csdn.net/dok12/article/details/80152239
步骤(3)见
https://blog.csdn.net/dok12/article/details/801730

本篇先介绍步骤1。工具,单片机小精灵软件,免安装,直接运行。

打开单片机小精灵软件,选择串口波特率选项。必须选择好晶振和波特率。其他选项,c语言还是汇编,是否串口中断,波特率加倍,允许接收都自己决定。
因为淘宝买到的单片机实验板是12M晶振,蓝牙模块的默认波特率是9600。所以一开始输入这两项数据。
结果发现误差太大,必须修改。晶振改不了,只好改波特率了。
修改波特率为2400后误差控制在千分之一点六,效果不错,得到了一个C语言的串口通信基本框架了。

根据这个框架做了个C语言程序,目标是对单片机实现蓝牙通讯,实现不同的单片机流水灯效果,并且得到回复数字8。
#include <reg51.h>
unsigned char k;
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 = 0xF3;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
/*******延时函数*************/
void delay(unsigned int i)
{
    unsigned char j;
    for(i; i > 0; i--)   
        for(j = 255; j > 0; j--);
}
void main(void)
{	k=0;
    InitUART();
	while  (1){
	if(k==1)
	{P1=0xff;delay(500);P1=0x00;delay(500);}
	else if (k==2)
	{P1=0x01;delay(500);P1=0xfe;delay(500);}
	else 
	{P1=0x02;delay(500);P1=0xfd;delay(500);}
	}
}
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        //add your code here!
		k++;
		if(k>2)k=0;
		SendOneByte(8);
    }
    else
        TI = 0;
}






2019-07-02 10:14:32 JH39456194 阅读数 901
  • 串口通信和RS485-第1季第13部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第13个课程,主要讲解了串行通信UART及其扩展RS485。本课程很重要,因为串口通信是我们接触的早也简单的通信方式,是后续继续学习SPI、I2C甚至USB、网络通信等的基础,大家务必认证对待完全掌握。

    6011 人正在学习 去看看 朱有鹏

#1.准备工具(硬件、软件)

硬件:51单片机开发板、ESP8266无线模块(ESP8266-01)、TTL-USB串口、杜邦线、数据线;

软件:keil uv4单片机软件、STC-ISP烧录软件、串口调试助手:SSCOM或ATK-XCOM、TCP/UDP调试助手:SocketTool或网络调试助手。

#2.实验步骤

(1)先将ESP8266-01和TTL-USB串口连接,再接上电脑,下面是接线图,通过电脑来检测无线模块的通信是否正常。

ESP8266-01

TTL-USB

TXD

RXD

RXD

TXD

CH_PD、VCC

3.3V或5V(会很烫,容易烧坏)

GND

GND

                                 

 (2)AT指令测试

AP模式:1)ESP8266作Server端,电脑作Client端。(本实验方式)

在按上述方式连接电脑后,打开ATK-XCOM调试助手,按照顺序输入以下指令,如果每条指令都返回OK,则证实指令成功。

AT+RST返回OK(这是重启模块,开始执行指令);

AT+CWMODE=3AT+CWMODE=2,返回OK(1-Station模式, 2-AP模式, 3-AP兼Station模式);

AT+CWSAP="wifi_yuan","123456789",11,4,返回OK(该指令在AP模式开启后生效);

AT+CIPMUX=1,返回OK(0-单路连接模式, 1-多路连接模式);

AT+CIPSERVER=1,8080返回OK0-关闭server模式,1-开启server模式);

接着打开SocketTool软件,选择Client,填端口号,模块地址。

2)ESP8266作客户端,电脑端作服务端(补充)

关闭 server 服务 (如果没有开启 server 服务,可免除此步骤)

发送命令: AT+CIPSERVER=0(设置指令)

创建服务器

 

点击 Listening,变成红色就可以了。

发送命令: AT+CIPMUX=1(开启多连接模式)

建立 TCP 连接
发送命令 AT+CIPSTART=2,"TCP","192.168.4.101",8080 (设置指令)

向服务器发送数据
发送命令 AT+CIPSEND=2,8(设置指令) (通过上一条指令 AT+CIPSTART 设置为 ID=2

(3)实验操作。

1)单片机连接ESP8266模块,TXDRXDRXDTXD3.3VCH_PDVCCGNDGNDSTC89C52的引脚图可以百度,也可以用其他芯片。

2)keil uv4软件编译程序,操作用法自己百度,把程序生成hex文件后,用STC-ISP烧入单片机,记得烧写程序时,把ESP8266VCC接口拔下,防止影响程序烧入单片机。当程序烧入单片机后,连接好ESP8266,会在ATK-XCOM助手中生成程序中的AT指令,此时通过AP模式1)方式连接,电脑连接ESP8266wifi,这时在SocketTool或网络调试助手中输入GP  0,红灯亮,接收区为ATK-XCOM,显示红灯亮字样,GP  1,红灯灭,GP  2,绿灯亮,GP  2,绿灯灭,还有黄灯等,根据程序的指令操作LED的灯亮灭。

(4)程序

#include <reg51.h>

#define uint unsigned int

#define uchar unsigned char  

sbit LED0=P1^0;          //红灯

sbit LED1=P1^2;                //绿灯

sbit LED2=P1^4;            //黄灯

 

/*****************相关变量**************/

uchar Receive,i,qj,yz,zz,ht;                             

uint n; 

uchar Recive_table[40];                  //用于接收wifi模块反馈到MCU上的数据 

 

/*******************************************************************

名称:延时函数  作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待....... 

********************************************************************/

void ms_delay(uint t)

        uint i,j; 

        for(i=t;i>0;i--)  

        for(j=110;j>0;j--);

}  

 

void us_delay(uchar t)

        while(t--);

}        

 

void Uart_Init()                                //使用定时器1作为波特率发生器(STC89C52STC89C51AT89C51等均可)

    TMOD = 0x20;

    SCON = 0x50;                                 //设置串行方式

    TH1 = 0xFD;                                         //波特率9600

    TL1 = TH1;

    PCON = 0x00;

    EA = 1;                                                //总中断打开

    ES = 1;                                                //开串口中断 

    TR1 = 1;                                        //启动定时器1

}

 

/********************************************************************

名称:串口发送函数  功能:MCU向无线WIFI模块ESP8266发送数据 

********************************************************************/

void Send_Uart(uchar value)

        ES=0;                                                  //关闭串口中断 

        TI=0;                                           //清发送完毕中断请求标志位  

        SBUF=value;                                 //发送 

        while(TI==0);                                 //等待发送完毕  

        TI=0;                                           //清发送完毕中断请求标志位  

        ES=1;                                                  //允许串口中断  

 

/********************************************************************

名称:WIFI模块设置函数  作用: 启动模块,以便可以实现无线接入和控制 

********************************************************************/

 

void ESP8266_Set(uchar *puf)         // 数组指针*puf指向字符串数组                

{   

        while(*puf!='\0')                    //遇到空格跳出循环 

        {  

                Send_Uart(*puf);                  //WIFI模块发送控制指令。  

                us_delay(5);  

                puf++;   

        } 

        us_delay(5); 

        Send_Uart('\r');                         //回车 

        us_delay(5); 

        Send_Uart('\n');                           //换行 

}

 

/********************************************************************

名称:WIFI模块发送函数  作用: 启动模块,以便可以实现无线接入和控制 

********************************************************************/

void ESP8266_Sent(uchar *puf)      // 数组指针*puf指向字符串数组              

{

      ESP8266_Set("AT+CIPSEND=0,26"); 

      while(*puf!='\0')    //遇到空格跳出循环

      {

           Send_Uart(*puf);   //WIFI模块发送控制指令。

           us_delay(5);

           puf++;     

      }

      us_delay(5);

      Send_Uart('\n');   //换行

      ms_delay(10);

}

/********************************************************************

名称:主函数  作用:程序的执行入口 

********************************************************************/

 

void main()

{         

        Uart_Init();

              ms_delay(2000);

              ESP8266_Set("AT+RST");                                                                                           //波特率发生器

        ms_delay(2000);

        ESP8266_Set("AT+CWMODE=2");                                                         //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式  

        //ms_delay(2000);

        //ESP8266_Set("AT+RST");                                                                         //重新启动wifi模块           

        ms_delay(2000);

        ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4");          //AT+CWSAP="wifi_yuan","123456789",11,4  设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK

        ms_delay(2000);

        ESP8266_Set("AT+CIPMUX=1");                                                                //开启多连接模式,允许多个各客户端接入

        ms_delay(2000);

        ESP8266_Set("AT+CIPSERVER=1,8080");                                          //启动TCP/IP 实现基于网络//控制         ESP8266_Set("AT+CIPSERVER=1,5000"); 

        ms_delay(2000);

        ESP8266_Set("AT+CIPSTO=0");                                                         //永远不超时

        ES=1;                                                                                           //允许串口中断                

        qj=1;

        zz=1;

        yz=1;

        ht=1;

        LED0=1;

        LED1=1;

        LED2=1;

        while(1)  

        {   

                if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P')&&(Recive_table[3]=='D'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭   

                {          

                        if((Recive_table[9]=='G')&&(Recive_table[10]=='P'))           

                        {      

                                if(Recive_table[15]=='0')     

                                {      

                                        LED0=0;                         //红灯亮                         

                                    ESP8266_Sent("1号灯开灯miandeng");

//wifi模块向pc端或手机端 发送"灯灭

                                }                               

                                else

                                if (Recive_table[15]=='1')     

                                {              

                                        LED0=1;                         //红灯灭

                                    ESP8266_Sent("1号灯关灯liangdeng");    

//wifi模块向pc端或手机端 发送"灯亮

                                }

                                else

                                if (Recive_table[15]=='2')     

                                {             

                    LED1=0;            //绿灯亮 

                                        ESP8266_Sent("2号灯开灯miandeng");        

                                }

                                else

                                if (Recive_table[15]=='3')     

                                {             

                        LED1=1;                    //绿灯灭

                                        ESP8266_Sent("2号灯关灯miandeng");

                                }

                                else

                                if (Recive_table[15]=='4')     

                                {             

                        LED2=0;                       //黄灯亮

                                        ESP8266_Sent("3号灯开灯miandeng");

                                } 

                                else

                                if (Recive_table[15]=='5')     

                                {             

                        LED2=1;                       //黄灯灭

                                        ESP8266_Sent("3号灯关灯miandeng");

                                }                                                                                                                                                             

                        } 

                }

          }   

}   

 

/********************************************************************* 

名称:串行通讯中断  作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据正常的收发。 

********************************************************************/

 

void Uart_Interrupt() interrupt 4        

{   

        static uchar i=0; 

        if(RI==1) 

        {  

                RI=0;  

                Receive=SBUF;                                                        //MCU接收wifi模块反馈回来的数据      

                Recive_table[i]=Receive;  

                if((Recive_table[i]=='\n'))

                {                    

                        i=0;

                }   

                else i++;                                                                                  //遇到换行 重新装值 

        }  

        else TI=0;  

}

2018-11-30 18:20:18 ZL14ZM 阅读数 551
  • 串口通信和RS485-第1季第13部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第13个课程,主要讲解了串行通信UART及其扩展RS485。本课程很重要,因为串口通信是我们接触的早也简单的通信方式,是后续继续学习SPI、I2C甚至USB、网络通信等的基础,大家务必认证对待完全掌握。

    6011 人正在学习 去看看 朱有鹏

由于程序中我的stm32单片机都是做的从机来和主机进行通信的,都是modbus协议通过串口来实现通信的。

之前为了调通串口,所以用的是单片机的串口和串口助手进行的通信,为了更方便的模拟主机modbus,我决定采用软件modbus poll.  modbus poll 和 mosbud slave 可以配套使用,在同一台电脑运行的时候,需要使用虚拟串口,并且分别连上两个虚拟串口,才能实现通信。但是在这里我们是为了调试单片机的从机功能,因此我们只用modbus poll来模拟主机,单片机来模拟从机设备发送modbus协议数据。

Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持Modbus RTU、ASCII、TCP/IP。

Modbus Slave: Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。

假设,单片机的串口引脚TX RX通过USB_TTL接到电脑后,电脑会显示当前串口为COM7,那么modbus poll也连接上COM7,不需要再虚拟串口了。关于其配置如下。在Setup里面确定好 从机号,功能号,要读取从机的寄存器地址,要读取从机寄存器的个数,以及每次发送数据间隔的时间。Display发送的数据格式我选的是unsigned 无符号型的,和单片机程序判断接收的格式一致。

接下来,点击connect,连接好 COM口,配置好波特率, 数据位, 校验位, 停止位。

可以点击Display--communication 查看数据的接收和发送,或者之间点击 lol 标志。

可以看到当发送数据 TX :10 04 00 00 00 01 32 8B的时候,

单片机的串口会回复 RX: 10 04 02 00 03 05 32

如此,数据就完美了。

对于mosbus 协议作一点说明:

主机:TX 10(从机地址) 04(功能码)  00 00(访问从机寄存器地址)  00 01(寄存器个数)   32 8B(16bit crc)

从机:RX 10(从机地址) 04(功能码) 02(字节长度)  00 03(返回数据)  05 32(16bit crc)

一个寄存器里面存放16位的数据,一个16位数据2个字节长度。

 

 

2018-09-13 18:08:43 CBQ5789789 阅读数 380
  • 串口通信和RS485-第1季第13部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第13个课程,主要讲解了串行通信UART及其扩展RS485。本课程很重要,因为串口通信是我们接触的早也简单的通信方式,是后续继续学习SPI、I2C甚至USB、网络通信等的基础,大家务必认证对待完全掌握。

    6011 人正在学习 去看看 朱有鹏

1.tx,rx是否插反

2.波特率设置。这个是跟晶振有关的,看一下程序的跟实际的是否一样。

3.奇偶校验,看一下通信奇偶校对不对,当初调试的时候,电脑给两块板

发的时候都是可以的,两个互相不能通信,简直无法理解。

后来发现,随便设置奇偶校验,电脑的串口助手都不会乱码。

嗨,实在不行,可以换一个串口软件,遇到过两次,是软件的问题。

 

自己遇到的,帮别人解决的就记得这些了,

有想起来再补充吧

2019-06-12 09:27:56 wwwmagic 阅读数 199
  • 串口通信和RS485-第1季第13部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第13个课程,主要讲解了串行通信UART及其扩展RS485。本课程很重要,因为串口通信是我们接触的早也简单的通信方式,是后续继续学习SPI、I2C甚至USB、网络通信等的基础,大家务必认证对待完全掌握。

    6011 人正在学习 去看看 朱有鹏

提到通信,软件工程师并不陌生,但他们更多的是指网络通信,尤其是指socket。你要是和软件工程师说什么串口、SPI、I2C、Modbus、CAN等等什么的,他们也会莫名其妙。俗话说,“隔行如隔山”,就是这么个道理。
今天我们不说socket,只说硬件中的几个基本的通信方式。
硬件虽然属于底层,但是通信也是少不了的,比如说,单片机要和电脑交换数据、单片机之间交换数据、单片机和传感器之间的数据交换以及单片机和其他硬件设备之间的数据交换等等,这些都涉及到通信的问题。既然要通信,肯定就涉及到怎么通信的问题,也就是我们经常说的通信协议。一个人自言自语,那不能叫交流,至少得两人,你一句我一句,才能算是交流。所以通信协议需要规定两个人谁先说、谁后说,我点点头,表示你可以继续说,我摇摇头,表示你不能再说了。
单片机的通信协议有很多,但是经常用到的主要是uart、spi、i2c以及usb。别看这些英文莫名其妙,但本质都是一样的,无非就是规定什么信号表示选择设备,什么信号表示开始,什么信号表示结束,什么信号表示对方回复。这就和我们平时打电话一样,通信录里那么多的朋友,你不能一个电话打给所有人吧,那就成了广播了。所以我们得先选择其中一个人,比如说赵丽颖小姐姐,单片机里将这个动作就定义成一个信号,比如说我发送连续1秒钟的高电平,小姐姐如果接我的电话,她就给我回一个信号,比如说间隔500毫秒,连续三次,然后电话就通了。这时候就可以传送数据了,看看就这么简单。
当然,实际通信中,因为需要考虑到诸多因素,情形比我们上面描述的要复杂一些。我们今天只需要对这几个通信协议有个概念就行,具体每个通信协议是如何定义和操作的,到具体应用的时候再详细描述不迟。
非常感谢大家的阅读!祝大家情人节快乐!

没有更多推荐了,返回首页