求解(为何发送不了字符串)
st吧
全部回复
仅看楼主
level 4
乜溪北 楼主
#include <iostm8s103f3.h>
#include <stdio.h>
#define USART_REC_LEN (0x3fff) //内存的数组最大值
#define SIZE (200) //数组长度
unsigned int USART_RX_STA=0; //标志
char USART_RX_BUF[SIZE]={0};
//////////串口初始化,设置波特率//////////////
void UART1_Init(unsigned int baudrate ) //波特率寄存器有两个:UART1_BRR2存储0~3,12~15位,UART1_BRR1存储4~11位;
{ //UART通用异步收发传输器
unsigned int bauddiv; // bauddiv分频
bauddiv=16000000/baudrate; //时钟16MHZ
//先写BRR2 , 再写BRR1;将波特率bauddiv共16位分配给两个波特率寄存器;
UART1_BRR2 = (unsigned char)((bauddiv & 0Xf000) >> 8) | (unsigned char) (bauddiv & 0X000f);
UART1_BRR1 = (unsigned char)(((bauddiv & 0X0FF0) >> 4)) ; //8位需要进行转化成unsigned char
UART1_CR1_bit.UART0 = 0;//使能UART1;CR1可被默认
UART1_CR2_bit.RIEN = 1;//使能接收中断
UART1_CR2_bit.TEN = 1;//使能UART1发送数据
UART1_CR2_bit.REN = 1;//使能UART1接收数据
}
//////////////发送数据的函数////////////////////////////////
void UART1_SendData(unsigned char byte) //byte是接收的数据
{
while(UART1_SR_bit.TXE == 0); //TXE状态寄存器先等待寄存器中原先的数据先发送完;等待发送数据寄存器为空
UART1_DR = byte; //把数据写入数据寄存器,发送
}
///////////////////写入一串字符串///////////////////////////////////
void UART_putstr(const char *str)
{
while(*str != '\0')
{
UART1_SendData( *str++);
}
}
///////////////////////////////////////////////////////////////
void printn(unsigned int n, unsigned int b)
{
static char *ntab = "0123456789ABCDEF";
unsigned int a, m;
if (n / b)
{
a = n / b;
printn(a, b);
}
m = n % b;
UART1_SendData( ntab[m]);
}
int UART_printf(const char *fmt, ...)
{
char c;
unsigned int *adx = (unsigned int*)(void*)&fmt + 1;
_loop:
while((c = *fmt++) != '%')
{
if (c == '\0') return 0;
UART1_SendData(c);
}
c = *fmt++;
if (c == 'd' || c == 'l')
{
printn(*adx, 10);
}
if (c == 'o' || c == 'x')
{
printn(*adx, c=='o'? 8:16 );
}
if (c == 's')
{
UART_putstr((char*)*adx);
}
adx++;
goto _loop;
//return 0;
}
/////////////////////////////////////////////////////////
void main(void)
{
asm("sim"); //关闭系统总中断
CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1 内部时钟 = 16Mhz
UART1_Init(9600); //调用串口2初始化函数,并设置波特率为9600
bp
s
asm("rim");
while(1); //等待UART1接收数据
}
//////////中断程序//////////////////////////
#pragma vector = 20
__interrupt void UART1_RX_IRQHandler() //__interrupt void UART1_RX_RXNE(void)
{
unsigned char RES; //端口/引脚之间不能直接进行数据传递,要定义变量
UART1_SR_bit.RXNE = 0; //进行读数据时,要将RXNE=0;
RES=UART1_DR; //数据寄存器中数据赋值给ch;
if ((USART_RX_STA & 0x8000)==0) ///高1位1
{
if (USART_RX_STA & 0x40000) ///高2位1
{
if(RES!=0x0a) ///接收的字符串前2位全1
{
USART_RX_STA = 0;
}
else
{
UART_putstr(USART_RX_BUF);
USART_RX_STA|=0x8000;
}
}
else
{
if(RES==0x0d) USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0x3fff]=RES;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
2016年09月30日 08点09分 1
level 1
请问可以发送字符吗?
2016年10月12日 02点10分 2
1