社区导航

 

搜索
查看: 5299|回复: 15

模拟串口的问题

[复制链接]

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-17 19:32 | 显示全部楼层 |阅读模式
接收的脚是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;
  }
  
  }
}

92

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-17 20:12 | 显示全部楼层
MARK

回复

使用道具 举报

101

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-17 20:27 | 显示全部楼层
收到第一下降沿后,第一个有效的数据位经过1.5位时间读取,以后过1位时间读取一个位......

回复

使用道具 举报

118

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-17 20:52 | 显示全部楼层
ding

回复

使用道具 举报

93

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-17 22:28 | 显示全部楼层
既然有乱码就说明能收到数据,用示波器看看你UART0的TX的波形,波特率还是准确点好。

回复

使用道具 举报

99

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

回复

使用道具 举报

116

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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


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

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

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

回复

使用道具 举报

87

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-18 09:29 | 显示全部楼层
问题应该就是在这里了:
引用 2 楼 great_bug 的回复:
收到第一下降沿后,第一个有效的数据位经过1.5位时间读取,以后过1位时间读取一个位......

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

回复

使用道具 举报

103

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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


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

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

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

回复

使用道具 举报

109

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

回复

使用道具 举报

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-18 14:20 | 显示全部楼层
你可以把乱码贴出来,让大家帮你分析一下。
显示的时候改成hex方式显示,千万别贴字符的。

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

回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-18 14:58 | 显示全部楼层
引用 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

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

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

回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-18 16:25 | 显示全部楼层
引用 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


少说了一句,还有原码

回复

使用道具 举报

92

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-12-19 15:46 | 显示全部楼层
引用 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,当然是错误的

回复

使用道具 举报

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

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 06:41 , Processed in 0.483536 second(s), 36 queries , Gzip On, MemCache On.

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