打印

串口通信问题

[复制链接]
830|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkat|  楼主 | 2013-10-27 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是用C写的程序,芯片是mega8,当上机位发送数据时,下机位无法接受到数据,经测试应该是没有产生(USART_RXC_vect)中断,而且下机位单纯的发送数据在上机位显示也不正确,至于发送的内容以及下机位在收到信息之后相关的逻辑处理在这里不详述,主要问题是现在下机位无法接收到数据以及发送数据在上机位不正确。求解。同时想知道这类问题如何进行调试,避免以后遇到类似的问题不会自己解决,谢谢了!下面是代码部分
#include <avr/io.h>
#include <avr/interrupt.h>

#define UART_BEGIN_STX 0xBB
#define UART_END_STX 0xEE

#define TX_BUFFER_SIZE 5
#define RX_BUFFER_SIZE 5

unsigned char tx_buffer[TX_BUFFER_SIZE];
unsigned char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_counter,tx_counter,tx_rd_index,tx_wr_index;
volatile unsigned char Uart_RecvFlag=0;

ISR(USART_TXC_vect)
{
    if(tx_counter)
    {
        --tx_counter;
        UDR=tx_buffer[tx_rd_index];
        if(++tx_rd_index == TX_BUFFER_SIZE)
            tx_rd_index=0;
    }
}

void put_char(unsigned  char c)
{
    while(tx_counter == TX_BUFFER_SIZE);
    cli();
    if(tx_counter||((UCSRA&(1<<UDRE))== 0))
    {
        tx_buffer[tx_wr_index]=c;
        if(++tx_wr_index == TX_BUFFER_SIZE)
            tx_wr_index=0;
        ++tx_counter;
    }
    else
        UDR=c;
    sei();
}

ISR(USART_RXC_vect)
{
    unsigned char status,data;
    status=UCSRA;
    data=UDR;
    if(!Uart_RecvFlag)
    {
        if((status & ((1<<FE)|(1<<PE)|(1<<DOR)) )==0)
        {
            rx_buffer[rx_counter] =data;
            rx_counter++;
            switch(rx_counter)
            {
                case 1:
                    if(data!= UART_BEGIN_STX)
                        rx_counter=0;
                    break;
                case 4:
                    if(data!=(rx_buffer[1]^rx_buffer[2]))
                        rx_counter=0;
                    break;
                case 5:
                    rx_counter=0;
                    if(data == UART_END_STX)
                        Uart_RecvFlag=1;
                    break;
                     
            }
        }
    }
}
int main(void)
{
unsigned char channel=0x00;
unsigned char tx_1=0x00,tx_3;

DDRB |= 1<<5;
PORTB &= ~(1<<5);

DDRD &= ~(1<<2);
PORTD |= (1<<2);

UCSRA=0x00;
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH=0x00;
UBRRL=0x19;

sei();

  while(1)
  {
     if(Uart_RecvFlag)
       {
            switch(rx_buffer[1])
            {
              case 0xA0:
                  tx_1=0xB0;
                  if(PIND &(1<<2))
                      channel=0x40;
                  else
                      channel=0x00;
                  break;
              case 0xA1:
                  tx_1=0xB1;
                  channel=0x01;
                  if(rx_buffer[2]==0)
                     PORTB &= ~(1<<5);
                  else
                       PORTB |= (1<<5);
                  break;
              default:
                    tx_1=0x00;
                  channel=0x00;
                  break;
          }
            
     tx_3=tx_1^channel;
     put_char(UART_BEGIN_STX);
     put_char(tx_1);
     put_char(channel);
     put_char(tx_3);
     put_char(UART_END_STX);
     Uart_RecvFlag=0;
     }
  }
}

相关帖子

沙发
xsgy123| | 2013-10-27 19:02 | 只看该作者
以前我的128串口收发时也没反应,
后来把两个串口号换了一下就好了

如果一个数据总是错误的误发为同一个
就是编码的问题,
例如你在电脑发送的是ASC2码
接受的是CHAR型数据

使用特权

评论回复
板凳
无冕之王| | 2013-10-27 19:12 | 只看该作者
建议挂个示波器看看波形,发送管脚和接收管脚的波形是否是你想要发送的,波特率是否正确。

使用特权

评论回复
地板
sinadz| | 2013-10-27 19:22 | 只看该作者
可以考虑一下LS的建议

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2726

帖子

0

粉丝