主题 : 关于串口通信的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 63269
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2012-02-16
最后登录: 2013-04-17
楼主  发表于: 2012-02-18 21:32

 关于串口通信的问题

最近在弄mini2440跟PC端通信,本来想在超级终端输入字符串 ,2440接收后再进行+1处理后发送到PC显示出来。如:在终端输入abc,隔会后显示bcd。。问题出现:
输入abc正常,可隔会显示类似于~的字符。。。望各位看看
#include "def.h"
//#include "option.h"
#include "2440addr.h"    
#include "2440lib.h"
#include "2440slib.h"      
//================================
#define uartPCLK 50000000
#define uart_rate 115200
#define uart_brd ((int)(uartPCLK/(uart_rate*16))-1)
void dely(U32 tt)
{
   U32 i;
   for(;tt>0;tt--)
   {
     for(i=0;i<10000;i++){}
   }
}
void init_uart()
{
    rGPHCON = rGPHCON & (~(0xffff)) ;
        rGPHCON = rGPHCON | (0xaaa0) ;
        rGPHUP  = 0xf;  // 使用内部上拉电阻。
    
        rUFCON0=0x00;   //不使用FIFO
        rUMCON0=0x00;   //不使用自动流控制
        rULCON0=0x03;   //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
        rUCON0=0x245;   //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止  //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
        rUBRDIV0=uart_brd;
}
void putc(char c)
{
    if(c=='\n')
    {
        while(!(rUTRSTAT0&0x2));
        dely(10);
        rUTXH0='\r';
    }
    while(!(rUTRSTAT0&0x02));
    dely(10);
    
        rUTXH0 = c;
    //rUTXH0(c);
    
}


void puts (char *s)
{
    while(*s)
    {
         putc(*s++);
    }
}
unsigned char getc()
{
    while(!(rUTRSTAT0&0X01));

        return rURXH0;
        

    
}
unsigned char gets(char *str)
{
    char c;
    char *s2=str;
    while((c=getc())!='\r')
    {
        putc(c);
        *s2++=c+1;
        
    }
    putc('\n');
}
int Main(int argc, char **argv)
{
    int i;
    U8 key;
    U32 mpll_val=0;
    int data;
    unsigned char c;
    mpll_val = (92<<12)|(1<<4)|(1);
    
    ChangeMPllValue(127,2,1);        //405MHZ
    rCLKDIVN = 0x05;// 1:4:8 PCLK=50MHZ;
    
    MMU_DisableICache();
    MMU_DisableDCache();


    rGPBCON = 0x155555;
  
    init_uart();
       data = 0x06;
//        unsigned char cccc;
      
while(1)
           {
           char *s;
           char *str;
           char *s2;
           puts("\n");
           puts("\n");
           puts("please enter any key:\n");
           gets(str);
           //putc(c);
           //dely(50);
           putc('\n');
           puts(str);
         }
  
   return 0;
}

级别: 新手上路
UID: 61330
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2011-12-27
最后登录: 2012-06-18
1楼  发表于: 2012-02-18 23:47
同感,不过我的是Tiny6410,差不多的串口通信例程,例子上是: Uart_SendString("\r\nHello, Mini6410\r\n");可是结果出来的Hello就是乱码,"Mini6410”这几个字符倒是可以正确显示,试过,除了前面的Hello不能正确显示之外,后面无论增加多少内容,都可以显示。
我的疑问是:
1、我的例程中发送函数如下,等待完了之后为啥要加Delay()???不是查询发送吗?加了延时是为韶?这个和LZ的类似;
void Uart_SendByte(int data)
{
    while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
     Delay(); ///////??????????
    WrUTXH0(data);
}
2、我是这么设想的,我们是基于Bootloader启动之后调试的串口裸机程序,串口已经被配置过了,重新配置是否会冲突,但是,我也试过不重新配置UART的情况,结果还是不正确
3、是不是串口上刚插上的时候有不稳定的电平,所以输出的前几个字符是乱码,那为什么复位的时候从bootloader打出来的字符都是正确的呢?
本人刚刚接触tiny6410,期待高手解答。
现在你混日子,小心将来日子混你!
级别: 新手上路
UID: 60650
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2011-12-14
最后登录: 2012-05-05
2楼  发表于: 2012-02-19 16:00
有没有tiny6410的uart程序
级别: 新手上路
UID: 63482
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2012-02-20
最后登录: 2012-02-20
3楼  发表于: 2012-02-20 17:44
rUCON0=0x245;   //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止  //信号,传输模式为中断请求模式,接收模式也为中断请求模式          改成rUCON0=0x5;   试试