3692|15

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

程序多跑一次 [复制链接]

程序如下:
while (1)
  {   
      /* Loop forever */
      if ( UART0Count != 0 )
      {
           U0IER = IER_THRE | IER_RLS;   /* Disable RBR */
           UARTSend( 0, (BYTE*)UART0Buffer, UART0Count );
             UART0Count = 0;
            U0IER = IER_THRE | IER_RLS | IER_RBR; /* Re-enable RBR */
           LCD_gotoxy(1,1);
           LCD_puts(UART0Buffer);
  }
串口程序1
void UARTSend( DWORD portNum, BYTE *BufferPtr, DWORD Length )
{
  WORD i=0;
if ( portNum == 0 )
  {
    while ( Length != 0 )
    {
   /* THRE status, contain valid data */
   while ( !(UART0TxEmpty & 0x01) );
   U0THR = BufferPtr;
   UART0TxEmpty = 0; /* not empty in the THR until it shifts out */
  //BufferPtr++;
  Length--;
  i++;
}
  }
  else
  {
while ( Length != 0 )
    {
   /* THRE status, contain valid data */
   while ( !(UART1TxEmpty & 0x01) );
   U1THR = BufferPtr;
   UART1TxEmpty = 0; /* not empty in the THR until it shifts out */
   //BufferPtr++;
   Length--;
    i++;
  }
  }
  return;
}
串口程序2
void UARTSend( DWORD portNum, BYTE *BufferPtr, DWORD Length )
{
  WORD i=0;
if ( portNum == 0 )
  {
    while ( Length != 0 )
    {
   /* THRE status, contain valid data */
   while ( !(UART0TxEmpty & 0x01) );
   U0THR = *BufferPtr;
   UART0TxEmpty = 0; /* not empty in the THR until it shifts out */
  BufferPtr++;
  Length--;
}
  }
  else
  {
while ( Length != 0 )
    {
   /* THRE status, contain valid data */
   while ( !(UART1TxEmpty & 0x01) );
   U1THR = *BufferPtr;
   UART1TxEmpty = 0; /* not empty in the THR until it shifts out */
   BufferPtr++;
   Length--;
  }
  }
  return;
}
  
上面的lcd_puts(char*)
为1602的字符形液晶显示器;
我碰到的问题是,我想串口写段数据,然后在用串口发回pc机,从lcd上显示刚才的字符;
可是在单步调试能正常显示,全速运行后只能显示1个字符,就是最后一个,谁碰到国这个问题?给解释下
解释下多跑一次:当显示字符后,然后显示器在第一行第一个字符区显示上次的最后一个字符,所以我认为是程序多跑了一次。

最新回复

你可以首先确定显示程序段是否正常,再测试发送一个字符,看显示是否正常,再看多个字符的情况,这样就基本可以确定是不是指针指向了UARTBuffer的最后。  详情 回复 发表于 2009-10-19 23:44
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
问题出在这两个函数
LCD_gotoxy(1,1);
          LCD_puts(UART0Buffer);
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我也怀疑这个句
这个是我更改的程序:
void UARTSend( DWORD portNum, BYTE *BufferPtr, DWORD Length )
{
  WORD i=0;
        if ( portNum == 0 )
  {
    while ( Length != 0 )
    {
          /* THRE status, contain valid data */
          while ( !(UART0TxEmpty & 0x01) );       
          U0THR = BufferPtr;
          UART0TxEmpty = 0;        /* not empty in the THR until it shifts out */
                //BufferPtr++;
                Length--;
                i++;
        }
  }
  else
  {
        while ( Length != 0 )
    {
          /* THRE status, contain valid data */
          while ( !(UART1TxEmpty & 0x01) );       
          U1THR = *BufferPtr;
          UART1TxEmpty = 0;        /* not empty in the THR until it shifts out */
          BufferPtr++;
          Length--;
    i++;
                }
  }
  return;
}
主要是将UART0Buffer数组的头指针定位在前面第一个数据上,从在机器上跑时,也是在最后一个字符显示到(1,1)的位置上。
这个是LCD_puts()程序
void LCD_puts ( BYTE *sp )
{
  while (*sp)
  {
        LCD_putc (*sp++);
  }
  return;
}
另外我试用了
LCD_gotoxy(1,1);
LCD_puts("helode");
从实验得知,这个是可以正常显示的。所以在执行玩LCD_gotoxy(1,1); 光标是在第一行,第一格的位置,然后显示完指针的内容后,才再一次定位的,依旧是显示完字符串后,当程序有一次开始的时候才定位到(1,1)
不知道怎么办?
楼上的给个建议
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
为什么LCD_gotoxy(1,1);
LCD_puts("helode"); 显示正常,你的显示内容是不是大于32个
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
不是,我显示的内容是将串口发送的数据存储在UART0Buffer缓存区内,然后显示在在LCD上,我发送1234567890,
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

7
 
发一次显示正常?第二次只显示最后一个字符?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
不是,每次都显示最后一个字符
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
我现在碰到的问题是在while循环中设定串口添加任何语句都不能正常的显示,除了LCD_puts()这个程序段
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
LCD_gotoxy(1,1);
LCD_putc (‘1’);
LCD_gotoxy(2,1);
LCD_putc (‘2’);
这样正不正常
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
是不是你的指针没有指向UART0Buffer缓存区的头部?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
关注中
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
这个程序是我测试的一个程序:
在主程序开始时声明BYTE str[]={"hello world"};  
while (1)
  {                                /* Loop forever */
        if ( UART0Count != 0 )
        {
          U0IER = IER_THRE | IER_RLS;                        /* Disable RBR */
          UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
          UART0Count = 0;
          U0IER = IER_THRE | IER_RLS | IER_RBR;        /* Re-enable RBR */
                LCD_gotoxy(1,1);
                //LCD_puts(( BYTE* )UART0Buffer);
                //LCD_putc(UART0Buffer[0]);
                LCD_puts(str);
                LCD_gotoxy(3,2);
                LCD_putc('c');
        }
这段程序测试结果,能正常显示,不过有一个可笑的操作,不知道是我的仿真器的事还是我内部设置的问题,我必须全部擦除芯片后,然后在向芯片写程序,正常显示,如果不这样,程序就会和上次写一样,我检查了下我的设置,是在编程时全部擦除的,这是个问题!

这是第二个测试程序:
while (1)
  {                                /* Loop forever */
        if ( UART0Count != 0 )
        {
          U0IER = IER_THRE | IER_RLS;                        /* Disable RBR */
          UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
          UART0Count = 0;
          U0IER = IER_THRE | IER_RLS | IER_RBR;        /* Re-enable RBR */
                LCD_gotoxy(1,1);
                LCD_puts(( BYTE* )UART0Buffer);
                //LCD_putc(UART0Buffer[0]);
                //LCD_puts(str);
                LCD_gotoxy(3,2);
                LCD_putc('c');
        }
测试结果:显示器显示最后一个字符'0'在第一行,第一个位置,'c'这个字符正常显示在预订的位置。
第三个测试程序:
while (1)
  {                                /* Loop forever */
        if ( UART0Count != 0 )
        {
          U0IER = IER_THRE | IER_RLS;                        /* Disable RBR */
          UARTSend( 0, (BYTE *)UART0Buffer, UART0Count );
          UART0Count = 0;
          U0IER = IER_THRE | IER_RLS | IER_RBR;        /* Re-enable RBR */
                LCD_gotoxy(1,1);
                //LCD_puts(( BYTE* )UART0Buffer);
                LCD_putc(UART0Buffer[0]);
                //LCD_puts(str);
                LCD_gotoxy(3,2);
                LCD_putc('c');
        }
测试结果和第二个程序一样,所以我怀疑UART0Buffer在UART0Send()程序执行完指向了最后一个字符,所以我将UART0Send()做了如下更改:
void UARTSend( DWORD portNum, BYTE *BufferPtr, DWORD Length )
{
        int i=0;
        if ( portNum == 0 )
  {
    while ( Length != 0 )
    {
          /* THRE status, contain valid data */
          while ( !(UART0TxEmpty & 0x01) );       
          //U0THR = *BufferPtr;
          U0THR = BufferPtr;
          UART0TxEmpty = 0;        /* not empty in the THR until it shifts out */
          //BufferPtr++;
          Length--;
        }
  }
}
程序还是显示最后一个字符'0',另外一个字符'c'显示正常
谁能给出个更改意见
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

14
 
应该不是程序多跑了

我觉得是你的 1602没理解透

可以参考我BLOG里的 ,1335的 ,代码很详细

 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
我现在感觉是在UART0Send()执行完成后UARTBuffer的值变成了最后一个,所以显示成最后一个字符
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
你可以首先确定显示程序段是否正常,再测试发送一个字符,看显示是否正常,再看多个字符的情况,这样就基本可以确定是不是指针指向了UARTBuffer的最后。
 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

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

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