swqshyj 发表于 2012-9-6 18:24:25

162串口问题比较 急求解

我用PC机发数据比如发5个,收到后放到一个数组里,再从串口把这数组数据发出去,为什么,PC机收显示的第一个字节是前一次发的最后一个字节。我发EA 05 06 07 02,收到检测EA收的,收到后放在BUF数组里,
发送后PC端显示02 EA 05 06 07。为什么,按理说,存不会错,判断EA后放到BUF【0】里的,求解,51做的话没问题

swqshyj 发表于 2012-9-6 18:34:50

急能说说不,什么可能的情况都说说,这项目之前本来是用51做,后面抓 信号时发现51不够快,换AVR,之前没用AVR,函数51上的没问题的

zhonggp 发表于 2012-9-6 18:41:05

上关键代码

swqshyj 发表于 2012-9-6 18:44:19

等我到办公室去

swqshyj 发表于 2012-9-6 18:57:18

ISR(USART0_RXC_vect)
{
   //cbi(UCSR0A,RXC0);
   if(UDR0==0xEA)
   {
                  if(flag_start==0)
                  {
                          flag_start=1;
                rs232buffer = UDR0;                     
                input_len= 1;
                                flag_end=0;
                                return;
                     }

   }
   else
   {
               if(!flag_start)return;
             rs232buffer = UDR0;
             len= rs232buffer;
               if(input_len==len)
               {
                          input_len=0;
                          flag_start=0;
                          flag_end=1;
               }
    }
                                                                                   
}



void SendByte( uint8_t byte )
{
        //sbi( PORTC , TEN_485 );
        UDR0 = byte;
    while ( !( UCSR0A & ( 1 << UDRE0 ) ) )
    { }
    Delayus( 900 );
   // cbi( PORTC , TEN_485 );   
}
void SendBytes(uint8_t*s,uint8_t len)
{
   uint8_t i;
   cli( );
   for(i=0;i<len;i++)
   {
       SendByte(*(s+i));
           Delayus( 900 );

   }
   sei( );

MAIN 里面
if(flag_end)
       {
          SendBytes( &rs232buffer,5);
       flag_end=0;
       }
指令EA头,第二个长度       

rainbow 发表于 2012-9-6 18:24:26

这里有问题:
if(UDR0==0xEA)
   {
                  if(flag_start==0)
                  {
                            flag_start=1;
                rs232buffer = UDR0;                     
                input_len= 1;
                              flag_end=0;
                              return;
                     }

   }


UDR0是FIFO结构,读了一次就变了。所以你的程序中当UDR0 == EA时,使用了两次,这是不行的。

你可以先定义一个临时变量,进入中断后把UDR0存入临时变量,再对临时变量进行操作。

你试试。

swqshyj 发表于 2012-9-6 19:15:05

OK,多谢楼上.刚试了OK,太感谢你了,今晚加班可以早点回去
页: [1]
查看完整版本: 162串口问题比较 急求解