单片机求解
配置cc2530串口发送数据帧
#include"ioCC2530.h"
#define LED3 (P1_0)
#define LED4 (P1_1)
#define LED5 (P1_3)
#define LED6 (P1_4)
unsigned char sendDat[8];
void delay(unsigned int time)
{
unsigned int i;
unsigned char j;
for(i=0;i<time;i++)
for(j=0;j<240;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
//配置串口
void UART0shushi(void)
{
PERCFG=0x00;
P0SEL =0X3C;
U0CSR |=0X80;
U0UCR |=0X80;
U0GCR =10;
U0BAUD=216;
UTX0IF=0;
}
void senddata(void)
{
sendDat[0]=0xAA;
sendDat[1]=0x01;
sendDat[2]=0xAB;
sendDat[3]=0x00;
sendDat[4]=0x00;
sendDat[5]=0x00;
sendDat[6]=0x00;
sendDat[7]=0xFF;
}
//UART0发送字节数据
void UART0SendByte(unsigned char c)
{
U0DBUF=c; //USART 0 接收/发送数据缓存
while(!UTX0IF); //等待TX中断标志,即U0DBUF就绪
UTX0IF=0; //清零TX中断标志
}
//UART0发送字符串
void UART0SendString(unsigned char *str,unsigned char zhen)
{
unsigned char i;
for(i =0;i<zhen;i++)
{
UART0SendByte(str[i]);
}
}
void paoma(void)
{
delay(1000);
LED3=0;
delay(1000);
LED4=0;
delay(1000);
LED5=0;
delay(1000);
LED6=0;
delay(1000);
LED3=1;
delay(1000);
LED4=1;
delay(1000);
LED5=1;
delay(1000);
LED6=1;
}
void main(void)
{
P1SEL &=~0X1B;
P1DIR |=0X1B;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
paoma();
senddata();
UART0SendString(sendDat,8);
}
程序运行正确,但串口没有发送数据帧
求大师解答
UART模式,每次中断就发送一个字符,所以我们应该定义一个结束的特殊字符来结束我们接收状态,当我们URX0IF 写0时就会清空接收U0DBUF的数据。
发送的时候我们可以判断字符串的结束符‘\0’,这个也是 一个一个发送的 ,UTX0IF = 0时也会清空发送U0DBUF的数据
UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。实际发送的帧包含8位或者9位,但是数据传送只涉及一个字节。
#include <ioCC2530.h>
#include <string.h>
#define LED1 P1_1
typedef unsigned char uchr;
typedef unsigned int uint;
//需要发送的字符串
uchr Tx_send[30],Sand_flag = 0;
uchr return_success_tip[10] = "success";
uchr return_fail_tip[10] = "fail";
uint string_length = 0;
void display(uint ms){
for(uint i=0;i<ms;i++)
for(uint j=0;j<535;j++);
}
void init(){
//led初始化
P1SEL &= ~0x02;
P1DIR |= 0x02;
LED1 = 1;
//设置晶振
CLKCONCMD &= ~0x47;
while(CLKCONCMD & 0x40);
//串口初始化 选用USART0 UART 进行通信
PERCFG = 0x00; //选择串口备用位置1
P0SEL |= 0x0c; //选择P0_2,P0_3作为串口 ,设置为外设功能
P2DIR &= ~0xc0; //设置优先级 USART 0 > USART 1 > 定时器1
U0GCR |= 8;
U0BAUD |= 59;
U0UCR |= 0x80; //清空USART0单元
UTX0IF = 0; //清空USART0写标志
URX0IF = 0; //清空USART0读标志
IEN0 |= 0x84; //开启总中断与RX中断使能
U0CSR |= 0xc0; //设置USART0为UART模式、开启UART接收器使能
}
/********************************************
发送数组字符
********************************************/
void TXS(char *Data){
LED1 = 0;
while(*Data != '\0')
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main(){
init();
while(1){
//当接收到数据后发送回去
if(Sand_flag == 1){
TXS(Tx_send);
LED1 = 1;
// strcpy(Tx_send,"");
Sand_flag = 0;
}
}
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(){
URX0IF = 0;
uchr temp = U0DBUF;
if(temp != '#'){
Tx_send[string_length++] = temp;
}else{
//改变状态转为发送
Sand_flag = 1;
string_length = 0;
}
}
可能问题出在串口初始化吧。确认波特率之类的串口参数正确吗?