搜索
bottom↓
回复: 1

我把cavar生成的串口通讯代码改用IAR编译,结果就通讯不正常了,烦请马老师指点一下迷津

[复制链接]

出0入0汤圆

发表于 2008-6-27 15:12:32 | 显示全部楼层 |阅读模式
接收一个字节,发送一个字节,就可以正常通讯,但只发送就错了,烦请马老师帮忙看看,指点一下学生!


#include <Iom64.h>
#include <ina90.h>


#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

#define RX_BUFFER_SIZE0 8

char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0<256
unsigned char rx_wr_index0,rx_rd_index0;
volatile unsigned char rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0;
volatile unsigned char  rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
char rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
#pragma vector = USART0_RXC_vect//RS232 接收完成中断
__interrupt void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}
char getRS232char(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
asm("cli\n");
--rx_counter0;
asm("sei\n");
return data;
}


// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0<256
unsigned char tx_wr_index0,tx_rd_index0;
volatile unsigned char tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0;
volatile unsigned int tx_counter0;
#endif

// USART0 Transmitter interrupt service routine
#pragma vector = USART0_TXC_vect//RS232 发送完成中断
__interrupt void usart0_tx_isr(void)
{
if (tx_counter0)
   {
   --tx_counter0;
   UDR0=tx_buffer0[tx_rd_index0];
   if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
   };
}

void PutRS232char(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
asm("cli \n");
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer0[tx_wr_index0]=c;
   if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
   ++tx_counter0;
   }
else
   UDR0=c;
asm("sei \n");
}

void PutRS232s(unsigned char *s)
{
    while (*s)
    {
        PutRS232char(*s);
        s++;
    }
    PutRS232char(10);
    PutRS232char(13);
}
// Standard Input/Output functions
void InitialRs232(void)
{
// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud rate: 9600
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x2F;
}
void TestRs232(void)
{
    char rchar;

    PutRS232s("Test RS232 Communication!");

    while(1)
    {
        //rchar= GetRS232char(NO_TIME_LIMIT);
        rchar = getRS232char();
        PutRS232char(rchar);
    }
}

void main()
{
    InitialRs232();
    asm("sei\n");

    PutRS232char('T');
    PutRS232char('E');
    PutRS232char('S');
    PutRS232char('T');
    while(1)
    {

        TestRs232();
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-6-29 13:21:55 | 显示全部楼层
前面的“TEST”能发出吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 06:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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