13361|26

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口发送接收数据乱码 [复制链接]

我的单片机串口发送和接收数据的时候老是乱码,波特率的设置我已经试过各种了,还是一样,请问这个问题如何解决呢?

最新回复

你的串行通信是单片机发送数据给pc,那么请问你的单片机是怎么发送数据的啊?是直接把一个你定义的数据存储区的数据发给pc,还是通过键盘中断来发送数据?如果是直接发送那就有问题了。因为你那个发送函数一般也没有握手的过程,单片机那边的数据复位就马上发送过去了,你那个串口助手可能还没有准备好接受呢。 一般来说,发送函数前加一个延时是没必要的吧。应该没有什么影响。。。。。  详情 回复 发表于 2010-5-17 18:34
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
发送能发送过去,可是在终端软件里面显示的是乱码,各种波特率的设置我的软件里面与代码里面我都设置过了,一直让终端软件的波特率与代码里面的相同。
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我做C8051F020的串口时也是这种情况,关键在串口初始化设置那块,参考别的程序后加进代码就好了。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
我的初始化可以确认没问题的。
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

5
 
可能问题:
1、线路连接问题,检查线路,看看是否有错。
2、干扰问题,是否有干扰源?增强接地。
3、串口配置,检查一下,有时候波特率过高会导致这样的情况。
4、你的程序,这个可能性不大,但也是有的。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(高级)

6
 
具体什么问题?软件硬件都有可能。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
是不是你的串口调试工具的显示方式不对啊,默认的是ASSIC格式,还有一种16进制格式可选。。。
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

8
 
我现在还就只是初始化以后然后写一个字母x,接着就调用发送函数发送到终端,正常应该在终端上显示的也是x,可是我这里显示的是?(问号)
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
一定是晶振没有选用了11.0592MHZ
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
奇偶校验什么的所有的硬件设置特别是波特率是不是正确!?感觉应该是这方面的问题,再有就是232芯片的外接电容是不是合适呢?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
具体问题具体分析,慢慢调试
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
是发送不成功?还是接收到乱码?估计是代码的问题了,各种波特率设置过了??你是说串口软件,还是你的代码里面的波特率设置?具体讲清楚点,呵呵
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
假如有示波器的话,楼主,可以从根源一步一步的跟踪UART信号。看到哪里出问题了。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
Jin51SIO是什么?

Jin51SIO 是一个自动生成单片机串口通信操作函数集的程序
Jin51SIO 是一套单片机串口操作的API函数集。

Jin51SIO能作什么?

1.只需要点几下鼠标,便可针对不同的晶震、不同的的波特率生成一套操作串口的源程序代码。
2.中断方式的接收数据
3.中断方式的发送数据,减少因等待发送而占用CPU时间
4.漂亮的环形队列处理,很少的缓冲空间解决大问题
5.提供SIO_VSend函数,可以格式化输出变量,例如:SIO_VSend("U=%.2f",fU);方便调试程序
6.能高效的、稳定的完成通信操作。

为什么要选用Jin51SIO?

1.出于研究的目的
Jin51SIO不是教学程序,而是作者多年的经验总结。可以研究作者的程序流程,程序格式应用到类似的项目中,并不一定是单片机串口通信。例如简洁的的环形队列操作,在很多程序中都可以应用。

2.可靠的完成项目
无需记忆串口设置中的相关参数,只需点击鼠标便自动生成。全部代码保留在可执行程序中,不会被外部修改;始终得到可靠的源码文件。

3.高效的进行程序修改调试
当需要测试不同波特率时,只需要点几下鼠标便生成了对应的代码。这只是几秒钟的事。同时提供了格式化输出函数,可以直接将内存变量通过串口输出到控制台或其它调试程序。

4.不受idata data区大小限制的收发缓冲
缓冲区在xdata区,可以设置为你想要的大小而不受128、256字节的限制,同时可以节约下这些高速访问区用于采样等。

5.节约时间,提高效率
现在的社会,时间就是一切。使用Jin51SIO后,可以一天内掌握单片机串口操作的真正流程。如果您看过Jin51SIO的代码,将会发现和网络上流传的那些单片机通信例程有什么不同了。
在新的项目中不用花时间解决串口通信问题。


http://item.taobao.com/auction/item_detail-0db2-4f09e6476eb55c8fe0a317d59cfb3b33.htm
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
每次接受到的数据都跟我传进来的不同,每次发送出去的也是乱码,可是我觉得我初始化里面没错呀!大虾帮我看看:
#define        GetSystemClock()                         (80000000ul)
#define        GetPeripheralClock()                (GetSystemClock() / (1< #define        GetInstructionClock()                (GetSystemClock())

#define DESIRED_BAUDRATE            (9600)
SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY );
         
    UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
    UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
        UINT BD;
        BD =UARTSetDataRate(UART1, GetPeripheralClock(), DESIRED_BAUDRATE);
    UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
INTEnable(INT_SOURCE_UART_RX(UART1), INT_ENABLED);
INTSetVectorPriority(INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_2);
    INTSetVectorSubPriority(INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0);
    // configure for multi-vectored mode
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
    // enable interrupts
    INTEnableInterrupts();
应该没问题吧,我找了好久都没找出问题的根源,不知道如何解决乱码。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
当然不是用初始化设置,是用一整套的
http://item.taobao.com/auction/item_detail-0db2-4f09e6476eb55c8fe0a317d59cfb3b33.htm
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
波特率设置是否正确?显示模式是否正确?
 
 
 

回复

413

帖子

7

TA的资源

一粒金砂(高级)

18
 
乱码还是波特率的设置问题。你那个波特率计算公式不对,所以你初始化设置的实际初值与你计算的数值时不相等的。波特率不对就会出现乱码。我的那个串口发送机就是这样,波特率公式不对。还有就是你发送和接收的格式要想好,调节准确。。。这样你实验几下就行了。如果你的晶振是11.0592M的话,那么9600波特率的初值是TH1=TL1=0xfd;SMOD=0;如果是电脑发送给单片机的话,那么你发送的一般来说默认的是ASSIIC码形式,你那边接收也显示也要是ASSIIC码格式。再自己试试就差不多了。。。。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

19
 
#define GetSystemClock() (80000000ul)  这是多少晶震?8千万? 80M ?

下载一个软件自己生成一下都不想搞?还非要等别人给你生成好?

假定晶震是8MHZ的,很难产生一个准确的波特率,用定时器1

  1. //////////////////////////////////////////////////////////////////////////
  2. // 名称: SIO_Init
  3. // 说明: 8.0MHZ晶震下初始化串口波特率为1200bps
  4. //       8位数据位,1位停止位,无校验
  5. // 返回: void
  6. void SIO_Init(void)
  7. {
  8.         //////////////////////////////////////
  9.         // 禁止串口中断
  10.         ES = 0;

  11.         //////////////////////////////////////
  12.         // SCON
  13.         // D7   D6 D5  D4  D3  D2  D1  D0
  14.         // SM0 SM1 SM2 REN TB8 RB8 TI  RI
  15.         // 0   1   0   0   0   0   0  0
  16.         //
  17.         // SM0=0 SM1=1 -> 8位UART 波特率可变
  18.         SCON = 0x40;

  19.         //////////////////////////////////////
  20.         // TMOD
  21.         // D7   D6  D5 D4    D3   D2  D1 D0
  22.         // GATA C/T M1 M0    GATA C/T M1 M0
  23.         // 0    0   1  0     ?    ?   ?  ?
  24.         //
  25.         // 定时器1定时方式2说明:
  26.         //     把16位计数器分为两部分,即以TL0为计数器,
  27.         // 以TH0作为预置寄存器。初始化时把计数初值分别
  28.         // 加载至TL和TH中。当计数溢出时,由预置寄存器TH
  29.         // 以硬件方法自动给计数器TL重新加载。
  30.         //
  31.         TMOD &= 0x0F;
  32.         TMOD |= 0x20;
  33.         TH1 = 0xDD;
  34.         TL1 = 0xDD;

  35.         //////////////////////////////////////
  36.         // PCON
  37.         // D7   D6 D5 D4 D3  D2  D1   D0
  38.         // SMOD -  -  -  GF1 GF0 PDWN IDLE
  39.         PCON |= 0x80;
  40.        
  41.         //////////////////////////////////////
  42.         TR1 = 1;// 启动定时器
  43.         REN = 1;// 允许串口接收数据
  44.         ES  = 1;// 开启串口中断
  45.        
  46.         //////////////////////////////////////
  47.         // EA
  48.         // D7 D6 D5  D4 D3  D2  D1  D0
  49.         // EA -  ET2 ES ET1 EX1 ET0 EX0
  50.         //
  51.         // 建议在全部初始化完成后,在主程序中启用
  52.         // EA = 1;
  53.         //
  54. }

复制代码


8M 用 1200bps 定时器1,还可以将就用一下, -0.83%的误差。
如果晶震本身再不准,估计就更难不乱码了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

20
 
我不知道如何去计算波特率,我用示波器测了波形图出来了不知道如何计算
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表