📄 text1.c
字号:
#include <AT91SAM7X256.H>
#include <lib_AT91SAM7X256.h>
typedef unsigned char uint8; //无符号8位整型变量
typedef unsigned short uint16;
#define uchar unsigned char
#define USART_INTERRUPT_LEVEL 7
#define AT91B_MCK (44236800) // Output PLL Clock (44 MHz)
/////////////////////////////////////////////////////
#define USART_BAUD_RATE 4800 //波特率
#define LONGSENT 11 //一桢数据长度 66 = 64(数据位) + 2 (校验和);
#define BELL (1<<24) //蜂鸣器
uint8 sen_buf[LONGSENT] = {0x12,0x23,0x10,0x34,0x56,0x21,0xad,0xcf,0x00,0x00,0x6c}; //存储待发送的数据和接收 PC机发送来得数据
/////////////////////////////////////////////////////////////////
char buf[LONGSENT],rcv_buf[LONGSENT]; //缓存PC机发送来得数据
int flag = 0,flag_rcv = 0; // 确定发送正确标志 //接收到完整字符串表制
uint16 buff_rx,compoint= 0;
AT91PS_USART COM0 ;
//*----------------------------------------------------------------------------
//* Function Name : Usart_c_irq_handler
//* Object : C handler interrupt function called by the interrupts
//* assembling routine
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void) __irq
{
AT91PS_USART USART_pt = COM0;
unsigned int status;
status = USART_pt->US_CSR ;
status &= USART_pt->US_IMR;
if ( status & AT91C_US_RXBUFF)
{
if (compoint<=LONGSENT)
{
buf[compoint] = USART_pt->US_RHR; //接收到一个字节边产生中断
}
if (compoint<LONGSENT)
{++compoint;}
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 1;
if (compoint==(LONGSENT)) //接收PC机发送的数据
{
compoint = 0;
flag_rcv = 1;
}
if (compoint==6) //接收PC返回的确认信号
{
if ((buf[0] == 0x59) && (buf[1] == 0x45) && (buf[2] == 0x53)
&& (buf[3] == 0x21) && (buf[4] == 0x0D) && (buf[5] == 0x0A))//"YES!",
{
compoint = 0;
flag = 1;
}
}
}
if ( status & AT91C_US_TIMEOUT) //超时判断
{
USART_pt->US_CR = AT91C_US_STTTO;
compoint = 0; //缓存字符串的数组的指针指向数组首地址
}
//* Reset the satus bit for error
USART_pt->US_CR = AT91C_US_RSTSTA;
*AT91C_AIC_EOICR = *AT91C_AIC_EOICR;
}
//----------------------------------------------------------------------------
void Usart_init ( void )
{
//-------------COM0-----------------------------
COM0= AT91C_BASE_US0;
//* Define RXD and TXD as peripheral
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA0_RXD0 ) |
((unsigned int) AT91C_PA1_TXD0 ) , // Peripheral A
0 ); // Peripheral B
//* First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
//* Usart Configure
AT91F_US_Configure (COM0, AT91B_MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0);
//* Enable usart
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN; //
//* open Usart interrupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 0x00);
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (int)Usart_c_irq_handler ;
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
// Set the PDC
// AT91F_PDC_Open *(AT91C_BASE_PDC_US0);
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 1;
COM0->US_RTOR = 10; //timeout set TO*4*bit_time
//* Enable USART IT error and AT91C_US_ENDRX
AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
// AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF);
}
/*******************************************************************************
函数功能:计算校验和(校验位 = 桢序号 + 数据)桢最后2位为校验和
返回值: 1:校验成功
0:校验失败
*******************************************************************************/
uint8 check( char m[])
{
uint8 i = 0 ,sum = 0;
while(i < LONGSENT-2)
{
sum += m[i++] ;
}
if (sum == ( (m[LONGSENT-2] << 8) + m[LONGSENT-1] ))
return 1;
else
return 0;
}
/****************************************************************************
函数说明:rcv_buf[i]为接受字符串的数组
****************************************************************************/
void recive ()
{
//接收字符串
int i = 0;
while(i < LONGSENT)
{
rcv_buf[i] = buf[i]; //
i ++;
}
compoint = 0;
}
/******************************************************************************
主程序:循环发送数据,并检测接收标志,如果检测到开始存储接收到的字符串
*******************************************************************************/
main()
{
uint16 time = 0;
Usart_init();
///////////////////////////////////////////////////////////////////
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, BELL); //关闭蜂鸣器
// AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,BELL);
////////////////////////////////////////////////////////////////////
while(1)
{
/* 发送部分 */
if( check( sen_buf))
{
if ( !time )//首次发送某一字符串
AT91F_US_SendFrame(COM0,(char *)sen_buf,sizeof(sen_buf),0,0);
if (flag ) //发送成功
{
flag = 0;
///////////////////////////////////////////////////////////////////
//在数组char sen_buf[LONGSENT]中装入新的即将发送的数据
///////////////////////////////////////////////////////////////////
}
time = 0;//没有收到确认消息或装载新的数据后继续发送字符串
}
/* 接收部分 */
if( flag_rcv)
{
flag_rcv = 0;//清除标志
if (check( buf)) //验证发送数据桢格式
recive();//接收字符串
}
} }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -