6854|15

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

模拟串口的问题 [复制链接]

接收的脚是LPC2136 ARM的2脚,此脚需要模拟接收。波特率9600,时钟:14.745600M。
我用定时器0定了两个值:第一:T0MR1=14745600/9600,这个用于定时接收数据位.第二:T0MR0=14745600/(9600*2)
这个用于起始位的定时检测。2脚设置为捕获输入,当2脚出现下降沿时,进入定时器0的中断,然后开始接收数据位,
数据位的接收就是每隔14745600/9600 us进入定时器接收一个bit。接收完一个字节后,就发给串口0,我琢磨着,这串口0不用再模拟了吧,我就将接收的数据直接赋给UART0的发送FIFO,即U0THR=data。可是串口工具上显示的全是乱码呢!
有人说波特率不对,我看了很多例子跟我设置的一样啊。
接收部分的程序:
if (count <8) //如果count <8,则接收数据
    {
  T0CCR=0x00;  //禁止捕获中断
  T0MCR=0x18;  //允许MR1匹配,匹配之后产生中断并复位计数器
  T0MR1=147456/baudrate;
  T0MR0=147456/(baudrate*2);
        temp >>=1;
        if ((IOPIN0&(SimuRXD))!=0) //若接收的数据是高电平
        {   
      temp |=0x80;
          }   
        count++;
  T0TCR=0x03;  //启动定时器,并复位定时器
    T0TCR=0x01;  //启动定时器
        }
发送部分的程序:
void SimuSendStr(uint8 *buf,uint16 lenght)
{  
  uint16 i;
  for (i=0;i   {
  U0THR =*(buf+i); //将值赋给UART0的发送FIFO
  while((U0LSR&0x40)==0); //等待数据发送完毕
    }

}


main()
{  
  
  GPIOInit();
  InitSimuUart(9600);
  uart0ini(9600);
  IOCLR0=0x40000000;
while(1)
{

  if(ReciveData==1)//如果接收到新数据,则发送出去
  { SimuSendStr(SimuUartRxBuff,SimuRxIndex);
    ReciveData=0;
    SimuRxIndex=0;
  }
  
  }
}

最新回复

嗯,你说的对,我定时确实不是104us,我的外部晶振是14745600 ,而我的定时器却不是这个频率,它是14745600的1.25倍,所以这样定时只相当于定时了83us,当然是错误的  详情 回复 发表于 2009-12-19 15:46
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
MARK
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
收到第一下降沿后,第一个有效的数据位经过1.5位时间读取,以后过1位时间读取一个位......
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
ding
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
既然有乱码就说明能收到数据,用示波器看看你UART0的TX的波形,波特率还是准确点好。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 heyme 的回复:
既然有乱码就说明能收到数据,用示波器看看你UART0的TX的波形,波特率还是准确点好。
如果波特率有一点误差,收到的数据就完全是乱码吗?我读到的数据是以每秒钟一次的速度的发到2脚,然后我读到串口0来的,我收到的总是乱码?除了波特率与其他的还有关吗?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 xiajunqing 的回复:
引用 4 楼 heyme 的回复:
既然有乱码就说明能收到数据,用示波器看看你UART0的TX的波形,波特率还是准确点好。
如果波特率有一点误差,收到的数据就完全是乱码吗?我读到的数据是以每秒钟一次的速度的发到2脚,然后我读到串口0来的,我收到的总是乱码?除了波特率与其他的还有关吗?


首先肯定如果总是乱码,那么波特率很有可能,而且应该误差有点大;

另外你说你用串口调试工具,那么调试工具也是有可能的,首先串口调试工具很很多,不知道你用的是哪个?你的显示设置得对吗?一般有HEX显示,也有字符显示等等

建议楼主检查自己的调试工具,如果不确定,可以换一个串口调试工具试下。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
串口工具不要显示字符,以16进制ASCII码显示,你把这个16进制的数据和你送到串口0发送的数据比较一下,看看有没有不同,就可以确认是哪一块发生了错误。我怀疑你送到串口0的数据可能就出错了,你按照楼上Great_Bug的说法来接收试试。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题应该就是在这里了:
引用 2 楼 great_bug 的回复:
收到第一下降沿后,第一个有效的数据位经过1.5位时间读取,以后过1位时间读取一个位......

虽然是模拟串口,但是使用了一个定时器与一个下降沿检测器,这模拟程序可真是优哉。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 6 楼 kyzf 的回复:
引用 5 楼 xiajunqing 的回复:
引用 4 楼 heyme 的回复:
既然有乱码就说明能收到数据,用示波器看看你UART0的TX的波形,波特率还是准确点好。
如果波特率有一点误差,收到的数据就完全是乱码吗?我读到的数据是以每秒钟一次的速度的发到2脚,然后我读到串口0来的,我收到的总是乱码?除了波特率与其他的还有关吗?


首先肯定如果总是乱码,那么波特率很有可能,而且应该误差有点大;

另外你说你用串口调试工具,那么调试工具也是有可能的,首先串口调试工具很很多,不知道你用的是哪个?你的显示设置得对吗?一般有HEX显示,也有字符显示等等

建议楼主检查自己的调试工具,如果不确定,可以换一个串口调试工具试下。
我的调试工具用的sscom.exe,现在大家都用的那种,我下载其他程序在里面就是好的,我是觉得我读来的时候就没有读的正确,但是我不知道如何修改了,我也按照大家说的过1.5位之后读取第一个数据位列,不行,乱码。谁能提供一个可以成功读取模拟串口数据的代码啊?让我比较一下,到底哪里出了错
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 7 楼 heyme 的回复:
串口工具不要显示字符,以16进制ASCII码显示,你把这个16进制的数据和你送到串口0发送的数据比较一下,看看有没有不同,就可以确认是哪一块发生了错误。我怀疑你送到串口0的数据可能就出错了,你按照楼上Great_Bug的说法来接收试试。
我的调试工具用的sscom.exe,现在大家都用的那种,我下载其他程序在里面就是好的,我是觉得我读来的时候就没有读的正确,但是我不知道如何修改了,我也按照大家说的过1.5位之后读取第一个数据位列,不行,乱码。谁能提供一个可以成功读取模拟串口数据的代码啊?让我比较一下,到底哪里出了错
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
你可以把乱码贴出来,让大家帮你分析一下。
显示的时候改成hex方式显示,千万别贴字符的。

另外你代码也不全。不好分析。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 zhoushunda960 的回复:
你可以把乱码贴出来,让大家帮你分析一下。
显示的时候改成hex方式显示,千万别贴字符的。

另外你代码也不全。不好分析。
这是最主要的代码,如果都贴出来的话好长的,更不容易看的懂,我接收的2脚可能是GPS数据,我的这个是一个手机模块,2脚的数据是什么我不清楚,只有接收到了我才知道,下面就是乱码了
88 0E 02 CA 48 48 40 B8 C0 CC CA F0 C8 F0 BC C0 C0 C4 B8 CE F2 C0 CC BC F2 CA F0 C2 B8 3C C2 34 34 1C 34 04 C4 32 46 38 CC C2 B8 0A 32 32 32 32 32 32 32 32 32 32 8A 38 0A 32 44 1C B2 F4 84 32 32 B2 8C 3A B8 C0 CA B8 B8 B8 C4 C2 B4 CE 08 CA 34 88 0E 02 8A 4A B4 B0 32 C4 B4 04 1C 46 C4 32 04 44 84 32 4A B2 46 3C C0 CC BC F2 CA F0 C2 B8 3C C2 34 34 04 34 04 C4 32 46 38 CC C2 B8 0A
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
波特率为9600表示一秒传输9600位,这样每位数据需要的时间是100000us/9600,大约为104us,你应该将你的定时中断间隔设置成104us,没用过LPC系列的芯片,不知道你的T0MR1=147456/baudrate方法是否正确,你可以做一个实验检验一下自己的定时是否正确,将时钟中断打开,然后在中断中输出一个脉冲,用示波器看周期是不是104us.
另外检测到下降沿后应该延时52us再按104us的间隔读数据位,这样可以使你的读操作位置尽可能在数据位中间位置。

这样写效率会好一些
T0MR0=147456/(baudrate*2);--->T0MR0=147456/(baudrate<<1);
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 xiajunqing 的回复:
引用 11 楼 zhoushunda960 的回复:
你可以把乱码贴出来,让大家帮你分析一下。
显示的时候改成hex方式显示,千万别贴字符的。

另外你代码也不全。不好分析。
这是最主要的代码,如果都贴出来的话好长的,更不容易看的懂,我接收的2脚可能是GPS数据,我的这个是一个手机模块,2脚的数据是什么我不清楚,只有接收到了我才知道,下面就是乱码了
88 0E 02 CA 48 48 40 B8 C0 CC CA F0 C8 F0 BC C0 C0 C4 B8 CE F2 C0 CC BC F2 CA F0 C2 B8 3C C2 34 34 1C 34 04 C4 32 46 38 CC C2 B8 0A 32 32 32 32 32 32 32 32 32 32 8A 38 0A 32 44 1C B2 F4 84 32 32 B2 8C 3A B8 C0 CA B8 B8 B8 C4 C2 B4 CE 08 CA 34 88 0E 02 8A 4A B4 B0 32 C4 B4 04 1C 46 C4 32 04 44 84 32 4A B2 46 3C C0 CC BC F2 CA F0 C2 B8 3C C2 34 34 04 34 04 C4 32 46 38 CC C2 B8 0A


少说了一句,还有原码
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 sj_dai 的回复:
波特率为9600表示一秒传输9600位,这样每位数据需要的时间是100000us/9600,大约为104us,你应该将你的定时中断间隔设置成104us,没用过LPC系列的芯片,不知道你的T0MR1=147456/baudrate方法是否正确,你可以做一个实验检验一下自己的定时是否正确,将时钟中断打开,然后在中断中输出一个脉冲,用示波器看周期是不是104us.
另外检测到下降沿后应该延时52us再按104us的间隔读数据位,这样可以使你的读操作位置尽可能在数据位中间位置。

这样写效率会好一些
T0MR0=147456/(baudrate*2);--->T0MR0=147456/(baudrate < <1);
嗯,你说的对,我定时确实不是104us,我的外部晶振是14745600 ,而我的定时器却不是这个频率,它是14745600的1.25倍,所以这样定时只相当于定时了83us,当然是错误的
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表