找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1770|回复: 6
打印 上一主题 下一主题
收起左侧

52单片机串口发送问题

[复制链接]
跳转到指定楼层
楼主
我通过52单片机串口发送数据0x7E,0x04,0x41,0x00,0x01,0xEF后接收缓冲区第一次显示 80 28 81 07 ,第二次显示84 28 81 0F,第三次显示80 28 81 07(因为我是隔一段时间发送一次,但是为什么显示的会不一样,而且每次都不同),但是我用串口助手直接发送 7E,04,41,00,01,EF,接收缓冲区中显示AA 02 41 EF,因为我这个是要发给一个音乐播放模块,直接用串口助手发,可以播放音乐,但是在代码里面写发送的数据却不能播放音乐,请问是为什么
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2018-7-17 20:18 | 只看该作者
晶振是多少的?波特率误差大吗?
回复

使用道具 举报

板凳
ID:305486 发表于 2018-7-18 08:36 | 只看该作者
ahshmj 发表于 2018-7-17 20:18
晶振是多少的?波特率误差大吗?

晶振11.0592,波特率误差应该不大
回复

使用道具 举报

地板
ID:373922 发表于 2018-7-18 11:15 | 只看该作者
首先你JDQdata8数组你定义大小为7,但是你初始化的只有6个,JDQdata8[6] 可能系统随机定义
回复

使用道具 举报

5#
ID:373922 发表于 2018-7-18 11:16 | 只看该作者
其次for循环i应该从0开始加,不然你永远打印不了JDQdata8[0]
回复

使用道具 举报

6#
ID:373922 发表于 2018-7-18 11:17 | 只看该作者
你这个应该就是波特率的问题,波特率配置
回复

使用道具 举报

7#
ID:373565 发表于 2018-7-18 12:19 | 只看该作者
/*-----------------------------------------------   名称:串口通信   编写:LZM   日期:2015.05   修改:无   内容:连接好串口波特率设置为9600,无奇偶校验         晶振11.0592MHz                 接上串口,可以接收到自己发送的字符 ------------------------------------------------*/  #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                          /******************************************************************* 请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度 (1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16 (2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32 例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200 *******************************************************************/ #define FOSC        11059200                //振荡频率 #define BAUD        9600                        //波特率 #define SMOD        1                        //是否波特率加倍 #if SMOD         #define TC_VAL        (256-FOSC/16/12/BAUD) #else         #define TC_VAL        (256-FOSC/32/12/BAUD) #endif  typedef unsigned char uint8; typedef unsigned int uint16;  code const char str1[] = "The string is 来自单片机!\r\n"; code const char str2[] = "Author: louis \r\n"; //const  限定一个变量不允许被改变。在一定程度上提高程序安全性和可靠性 //code 存储区间为 程序存储区  /***************函数声明*******************/ void InitUART(void); void SendOneByte(uint8); void SendrStr(const uint8 *ptr);  /****************主函数********************/ void main(void) {     uint8 i=0;     InitUART();      while(str2[i]!='\0')     {         SendOneByte(str2[i++]);             }      SendrStr(str1);      while(1); }  /****************中断服务函数***************/ void UART_ISR(void) interrupt 4 {     uint8 RX_Data;     //只响应"接收"中断,"发送"中断来了就直接抹掉     if(RI)    {      RI = 0;        //串口中断标志不能自己清除,需要手动清除      RX_Data=SBUF;      SendOneByte(RX_Data);    }    else      TI = 0;                //串口发中断是发送完缓冲区数据之后产生 }  /****************串口初始化函数*************/ void InitUART(void) {     TMOD = 0x20;    //定时器1,模式2工作模式                SCON = 0x50;    //串口工作模式1,允许REN   /* SCON: 模式 1,  8-bit UART, 使能接收         */     TH1 = TC_VAL;     TL1 = TH1;     PCON = 0x80;         //发送速率加倍     ES = 1;     EA = 1;     TR1 = 1; } /**************串口发送字符函数*************/ void SendOneByte(uint8 c) {     ES = 0;                        //禁止中断,让串口安心工作啊     SBUF = c;     while(!TI);                //等待发送完毕     TI = 0;                        //清TI中断     ES = 1;                        //打开中断 } /**************串口发送字符串函数*************/ void SendrStr(const uint8 *ptr) {     do     {         SendOneByte(*ptr);                //其实发送字符串也是在调用发送字符的函数~~     }while(*ptr++!='\0');        //要有结束判断,否则串口发送 字符串 不知道什么时候停止 }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表