打印
[STM8]

STM8S003串口接收问题

[复制链接]
2814|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
li603672183|  楼主 | 2018-12-1 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "iostm8s003f3.h"//主控芯片的头文件
#include "stdio.h"//需要使用printf()函数故而包含该头文件

#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char    uint8_t;
typedef unsigned int     uint16_t;
typedef unsigned long    uint32_t;

/*************************函数声明区域***************************/
void delay(u16 Count);                  //延时函数声明
void UART1_Init(void);                  //串口1初始化函数
void UART1_SendByte(u8 data);           //串口1发送单个字符函数
void UART1_SendString(u8* Data,u16 len);//串口1发送字符串函数
u8 UART1_ReceiveByte(void);             //串口1接收数据函数
int putchar(int ch);
u16 cmd[4];

#define IN1 PC_ODR_ODR7//电机输出引脚OUT2
#define IN2 PC_ODR_ODR6//电机输出引脚OUT1
#define IN3 PC_ODR_ODR5//电机输出引脚OUT4
#define IN4 PC_ODR_ODR4//电机输出引脚OUT3

void motor_init()
{
  PC_DDR_DDR4=1;
  PC_CR1_C14=1;  
  PC_CR2_C24=0;  //
  
  PC_DDR_DDR5=1;
  PC_CR1_C15=1;  
  PC_CR2_C25=0;  //
  
  PC_DDR_DDR6=1;
  PC_CR1_C16=1;  
  PC_CR2_C26=0;  
  
  PC_DDR_DDR7=1;
  PC_CR1_C17=1;  
  PC_CR2_C27=0;  //
}

void delay(u16 Count)
{
  u8 i,j;
  while (Count--)
  {
    for(i=0;i<10;i++)
      for(j=0;j<1;j++);
  }
}
void main(void)
{
   u16 num=0;
   CLK_CKDIVR=0x00;//选定HSI时钟源,配置频率为16MHz
   delay(10);//延时等待时钟稳定
   UART1_Init();//初始化串口1
   motor_init();

   while(1)
   {
     cmd[num]=UART1_ReceiveByte();//查询法接收串口数据
     num++;
     delay(20);
     /*实际电机一对应PCB上电机二,实际电机二对应PCB上电机一,下面标PCB上电机号*/
     if(cmd[0]==0X5A&&cmd[1]==0XA5&&cmd[2]==0X00&&cmd[3]==0X64)//电机二正转
     {
       IN1=0;
       IN2=1;
     }

void UART1_Init(void)
{
  //1.设定通信数据位数,此处设定为8位数据位,无校验位
  UART1_CR1 = 0x00;
  //2.设定通信停止位位数,此处设定为2位停止位
  UART1_CR3 = 0x00;
  //3.配置通信波特率参数,此处配置为9600bps
  UART1_BRR2 = 0x03;
  UART1_BRR1 = 0x68;
  //4.使能发送和接收功能
  UART1_CR2 = 0x0C;
}
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
   UART1_SR&=0xBF;//清零发送完成标志位TC
   UART1_DR=data;//发送数据到UART3数据寄存器
   //while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
   //原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
   //发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
   while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
   UART1_SR&=0xBF;//清零发送完成标志位TC
}
/****************************************************************/
//发送字符串函数UART1_SendString(),有2个形参Data和len无返回值
/****************************************************************/
void UART1_SendString(u8* Data,u16 len)
{
  u8 i=0;
  for(;i<len;i++)
    UART1_SendByte(Data[i]);//逐一发送字符数据
}
/****************************************************************/
//接收字符函数UART1_ReceiveByte(),无形参有返回值USART3_RX_BUF
//***********************************************
u8 UART1_ReceiveByte(void)
{
  u8 UART1_RX_BUF; //定义接收数据暂存变量
  while (!(UART1_SR & 0x20));//等待接收标志
  UART1_RX_BUF=UART1_DR;//取回接收到的数据
  return  UART1_RX_BUF;//返回暂存变量中的数据给调用者
}
/****************************************************************/
//发送字符重定向函数putchar(),有形参ch有返回值int
/****************************************************************/
int putchar(int ch)
{
  UART1_SendByte((u8)ch);//将Printf内容发往串口
  return (ch);
}
沙发
li603672183|  楼主 | 2018-12-1 16:41 | 只看该作者
我想请问下串口进不去是什么问题,程序应该怎么样

使用特权

评论回复
板凳
li603672183|  楼主 | 2018-12-1 16:42 | 只看该作者
发送5A A5 00 64  16进制

使用特权

评论回复
地板
磨砂| | 2018-12-5 10:01 | 只看该作者
是接收不到吗

使用特权

评论回复
5
晓伍| | 2018-12-5 11:01 | 只看该作者
用示波器卡卡看看

使用特权

评论回复
6
st代理| | 2018-12-5 11:06 | 只看该作者
程序没问题就是物料的问题了

使用特权

评论回复
7
观海| | 2018-12-5 12:03 | 只看该作者
确认硬件连接有没有问题先

使用特权

评论回复
8
labasi| | 2018-12-5 13:13 | 只看该作者
首选确认是否已经有数据在总线上了呢

使用特权

评论回复
9
wowu| | 2018-12-5 14:10 | 只看该作者
用示波器看了吗 总线上确实有波形吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

47

帖子

1

粉丝