最近在学习i/o模拟传口语,但是由于比较菜,不知怎么弄接收部分,,只能接收一个字节,,求指导,我的程序如下:#include "stm32f10x.h"
#include "sys.h"
#include "stdio.h"
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
#endif
//重定义fputc函数
int fputc(int ch, FILE *f)
{
void SendOneByte(u8 Byte);
SendOneByte((uint8_t) ch);
return ch;
}
#define POWER12V_high() GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define POWER12V_low() GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define TXD_high() GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define TXD_low() GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define datalen 200
u8 RX_BUF[datalen];
u16 RX_STA;
static void POWER12V_Configuration(void);
static void TXD_Configuration(void);
static void RXD_Configuration(void);
void SendOneByte(u8 BYte);
void RXDBYTE(void);
void SendOneByte(u8 Byte)
{
u8 i=8,tmp;
TXD_low();//发送起始位
delay_us(104);
//发送8位数据
for(i=0;i<8;i++)
{
tmp = (Byte >> i) & 0x01; //低位在前
if(tmp == 0)
{
TXD_low();
delay_us(104); //0
}
else
{
TXD_high();
delay_us(104); //1
}
}
TXD_high();
delay_us(104);
}
void SendBytes(u8 *str,u8 len) //发送数组最好用这个,也可发送字符串
{
u16 i;
for(i=0;i
{
SendOneByte(str[i]);
}
}
//
//void SendStr(u8 *str) //发送字符串,发送数组如果带0x00就中断发送了
//{
// while(*str)
// SendOneByte(*str++);
//
//}
int main(void)
{
delay_init();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
POWER12V_Configuration();
TXD_Configuration();
SendOneByte(0X55);
RXD_Configuration();
delay_us(104);
while(1)
{ u16 RX_STA=0;
u8 RX_BUF[datalen];
u8 i=9,DATA=0X00;
u8 kk;
kk=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
while(kk!=1)
{
delay_us(30);
while(i--)
{
DATA >>=1;
if(GPIOB->IDR&0x1000) DATA |=0x80;
delay_us(104);
}
DATA=(~DATA);
RX_BUF[ 200]=DATA;
RX_STA++;
TXD_Configuration();
SendBytes(RX_BUF,RX_STA);
RXD_Configuration();
}
}
static void POWER12V_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
static void TXD_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
static void RXD_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
不如学习IO模拟IIC或者SPI。串口直接用外设吧,字符串的处理才是要命的