打印
[技术求助]

一般28个字节之后就全是乱码了

[复制链接]
869|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuhany|  楼主 | 2017-8-13 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jiahy| | 2017-8-13 22:36 | 只看该作者
计算出来的分频值减去1之后再写?

使用特权

评论回复
板凳
wuhany|  楼主 | 2017-8-13 22:38 | 只看该作者
DLL和DLM?接收数据正常

使用特权

评论回复
地板
lizye| | 2017-8-13 22:43 | 只看该作者
将PC机的串口调试助手停止位设为2,754

使用特权

评论回复
5
wuhany|  楼主 | 2017-8-13 22:46 | 只看该作者
接收数据也没问题。但这些毕竟没有彻底解决问题!

使用特权

评论回复
6
shimx| | 2017-8-13 22:49 | 只看该作者

发送数据没有问题吗

使用特权

评论回复
7
wuhany|  楼主 | 2017-8-13 22:49 | 只看该作者

没有问题,754的串口之间发送、接收也没有问题,但就是外部发来的数据不能正确接收

使用特权

评论回复
8
jiaxw| | 2017-8-13 22:56 | 只看该作者
尝试别的了吗

使用特权

评论回复
9
wuhany|  楼主 | 2017-8-13 23:00 | 只看该作者
在754端晶体用了3.6864MHz,两个腿接的电容都是22pF,晶体工作正常,也比较稳定。

使用特权

评论回复
10
wuhany|  楼主 | 2017-8-13 23:10 | 只看该作者
我用了外部中断,中断方式接收数据。

      ChangeClockDivider(1,0);        // 1:2:2   

  ChangeMPllValue(0xa1,0x3,0x3);  // FCLK=50.7MHz  

//        总线初始化 BANK3

      rBWSCON=rBWSCON& (~(0xf<<12))|(0<<12);// |(1<<14)|(1<<15)

      rBANKCON3=0x5650;

  Port_Init();                                        // 初始化I/O口

  Isr_Init();

/***************        TL16C754中断管脚定义        *****************/

      rGPGCON &= ~((3<<0)|(3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10)|(3<<12)|(3<<14));

      rGPGCON |=        ((2<<0)|(2<<2)|(2<<4)|(2<<6)|(2<<8)|(2<<10)|(2<<12)|(2<<14));        

                                                                      //GPG0 ~ 7 set eint8 ~ 15

      rEXTINT1 &= (~((7<<0)|(7<<4)|(7<<8)|(7<<12)|(7<<16)|(7<<20)|(7<<24)|(7<<28)));

      rEXTINT1 |= ((4<<0)|(4<<4)|(4<<8)|(4<<12)|(4<<16)|(4<<20)|(4<<24)|(4<<28));               

                                                                      //set eint rising edge int

      rEINTPEND |= (1<<8)|(1<<9)|(1<<10)|(1<<11)|(1<<12)|(1<<13)|(1<<14)|(1<<15);                //

      rEINTMASK &= ~((1<<8)|(1<<9)|(1<<10)|(1<<11)|(1<<12)|(1<<13)|(1<<14)|(1<<15));        //

                                                                      //enable eint8~15

      ClearPending(BIT_EINT8_23);

      pISR_EINT8_23 = (U32)Uart_RxInt;        

      rINTMSK &= ~(BIT_EINT8_23);                // 开中断

//        rPRIORITY &= ~(3<<9);                        // 设定中断优先级

/****************        TL16C754复位                **********************/

      rGPFDAT &= ~(1<<7);

      Delay(100);

      rGPFDAT |= (1<<7);

      Delay(200);

      rGPFDAT &= ~(1<<7);

/****************        TL16C754初始化                **********************/

      for( ch=0; ch<8; ch++ )        

      {

              writeb( pEXT_COM_BASE_ADDR[ch]+LCR, 0x80 ); // when LCR b7 is 1, DLL & DLH are accessed

              writeb( pEXT_COM_BASE_ADDR[ch]+DLH, (BaudRateTab[3]>>8)&0x00ff );

              writeb( pEXT_COM_BASE_ADDR[ch]+DLL, BaudRateTab[3]&0x00ff );

              writeb( pEXT_COM_BASE_ADDR[ch]+LCR, 0x03 ); // 8-bits 1-stop no-parity

              writeb( pEXT_COM_BASE_ADDR[ch]+FCR, 0xc7 );        // c7

              writeb( pEXT_COM_BASE_ADDR[ch]+IER, 0x01 ); //0x01 enable receive interrupt

              writeb( pEXT_COM_BASE_ADDR[ch]+IIR, 0x01 );

              writeb( pEXT_COM_BASE_ADDR[ch]+MCR, 0x00 ); // 08

              Delay(1);        

      }

      while(1)

      {

              if( (NumOfUartRxInt>0)&&(NumOfUartRxInt<9) )

              {

                      temp = readb( pEXT_COM_BASE_ADDR[(NumOfUartRxInt-1)]+IIR );

                      temp = temp&0x3f;

                      if( (temp==0x0c)||(temp==0x04) )

                      {

                              temp1 = readb( pEXT_COM_BASE_ADDR[(NumOfUartRxInt-1)]+LSR );

//                                if( temp1&0x1)

                              {        

                                      RecData = readb( pEXT_COM_BASE_ADDR[(NumOfUartRxInt-1)]+RHR );

                                      writeb( pEXT_COM_BASE_ADDR[(NumOfUartRxInt-1)]+THR, RecData );

                                      NumOfUartRxInt = 0;

                                      RecData = 0;

                              }

                      }

              }        

      }

使用特权

评论回复
11
wuhany|  楼主 | 2017-8-13 23:14 | 只看该作者

我用串口调试助手发送了一串‘66666666666666……’,16c754接收之后再发送出去,调试助手显示如下:

36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 96 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 4F 4D 4D 4D 4D 4D 4D 4D 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 93 CB C9 C9 C9 C9 C9 C9 C9 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 D9 6C 6C 6C 6C 6C 6C 6C 6C 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 B6 9B 9B 9B 9B 9B 9B 9B 9B

用9600bps发送数据时,测得实际的波特率大概是9540,误差比较大。换过几个晶体,也调节过晶体的输出频率,初步确定应该不是因为晶体的精度不够才造成的这个现象。

使用特权

评论回复
12
spark周| | 2017-8-13 23:16 | 只看该作者
晶振两端的电容有没有接  或者容值是否按照数据手册上的推荐来的   

使用特权

评论回复
13
spark周| | 2017-8-13 23:18 | 只看该作者

那两个电容对电路影响很大   是起振电容   必须慎重

使用特权

评论回复
14
wuhany|  楼主 | 2017-8-13 23:21 | 只看该作者
嗯,我知道啦

使用特权

评论回复
15
jiahy| | 2017-8-13 23:23 | 只看该作者

用9600bps发送数据时,测得实际的波特率大概是9540,误差 0.67% 完全可接收的.
我怀疑是软件 BUG 引起的.

使用特权

评论回复
16
shimx| | 2017-8-13 23:26 | 只看该作者
那这个是波特率的设置问题的,看下你的主频的,在检查下你所设置的波特率的吧。

使用特权

评论回复
17
spark周| | 2017-8-13 23:29 | 只看该作者
一般的还涉及到波特率设置的调整参数的,这个需要好好设置的,不能出错的,不然大数据量的传输时就会出现这样的问题的。

使用特权

评论回复
18
wuhany|  楼主 | 2017-8-13 23:31 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

评论回复
19
shenmu2012| | 2017-8-15 15:37 | 只看该作者
这个跟波特率的设置还是关系比较大

使用特权

评论回复
20
vivilzb1985| | 2017-8-15 21:56 | 只看该作者
这个还是跟数据传输的频率相关系的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

879

主题

10435

帖子

4

粉丝