前言
发现制作了很多东西,但是从新制作的时候,时间久了又需要重新整理比较浪费时间,为了提高效率,特此开始记录制作东西的简单流程方便下次快速整理
流程
- Lora模块找好,上位机配置透明传输,之后当串口使用
2、当串口使用,无非就是一些变量的传输显示
技术点:
这一块知识看自己的STM32应用笔记
串口中断收发,自定义帧头帧尾,字节数据或者移位发扩大收缩小。
示列:
if(FLAG == 1){
USART_SendData(USART3,'A');
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
FLAG = 0 ;
printf("发送完成 \r\n");
delay_ms(100);
}
void USART3_IRQHandler(void) //串口接收数据且接收的数据包含头尾标识为例。
{//状态位只能有硬件置位也就是置1说明中断产生,软件只能读和清零
if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET) //中断产生 USART_GetITStatus串口状态检测函数
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清除中断标志
UsartPrintf(USART_DEBUG, "进入A\r\n");
Uart3 = USART_ReceiveData(USART3);
UsartPrintf(USART_DEBUG, "接收变量%c",Uart3);
flag=1;
}
}
union ddd
{
float ceshi;
unsigned char ceshi1[4];
}ccc;
union ddd ccc;
union fff
{
float W;
unsigned char ceshW[4];
}eee;
union fff eee; //共用体的声明
ccc.i=gpsx.longitude; //gpsx.longitude 是传感器已经采集的float型变量
USART_SendData(USART2,'A'); //帧头
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpsa=xxx.cc[0];
Usart_SendByte(USART2,gpsa);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpsb=xxx.cc[1];
Usart_SendByte(USART2,gpsb);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpsc=xxx.cc[2];
Usart_SendByte(USART2,gpsc);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpsd=xxx.cc[3];
Usart_SendByte(USART2,gpsd);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,'B');
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
//传输完一个float型变量
tp=gpsx.longitude;
sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到经度字符串
LCD_ShowString(30,120,200,16,16,dtbuf);
printf((char *)dtbuf,"Longitude:%.5f %1c",tp/=100000,gpsx.ewhemi);
eee.W=(gpsx.longitude);
USART_SendData(USART2,'C');
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpswa=eee.ceshW[0];
Usart_SendByte(USART2,gpswa);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpswb=eee.ceshW[1];
Usart_SendByte(USART2,gpswb);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpswc=eee.ceshW[2];
Usart_SendByte(USART2,gpswc);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
gpswd=eee.ceshW[3];
Usart_SendByte(USART2,gpswd);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,'D');
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
delay_ms(100);
USART_SendData(USART2,'E');
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)== RESET);
Usart_SendByte(USART2,temperature);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
delay_ms(100);
Usart_SendByte(USART2,humidity);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,'F');
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
union a
{
float sdata;
unsigned char cdata[4];
}b;
union c
{
float cdata;
unsigned char ddata[4];
}d;
union c d;
int i;
void USART3_IRQHandler(void) //串口接收数据且接收的数据包含头尾标识为例。
{//状态位只能有硬件置位也就是置1说明中断产生,软件只能读和清零
if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET) //中断产生 USART_GetITStatus串口状态检测函数
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清除中断标志
Uart3_Buffer[Uart3_Rx] = USART_ReceiveData(USART3);
// UsartPrintf(USART_DEBUG, "%s\n",&Uart3_Buffer[Uart3_Rx]);
Uart3_Rx++;
// UsartPrintf(USART_DEBUG, "Uart3_Buffer");
if(Uart3_Buffer[Uart3_Rx-1]=='B'||Uart3_Rx == Max_BUFF_Len)
//注意为什么是 Uart3_Rx-1 因为每次进中断就自加一、
buf 0 1
rx 1 2
{ UsartPrintf(USART_DEBUG, "进入B\r\n");
if(Uart3_Buffer[0]=='A')
{ UsartPrintf(USART_DEBUG, "进入A\r\n");
b.cdata[0]=Uart3_Buffer[1];
b.cdata[1]=Uart3_Buffer[2];
b.cdata[2]=Uart3_Buffer[3];
b.cdata[3]=Uart3_Buffer[4];
gpslongitude = b.sdata;
for(i=0;i<50;i++)
{
Uart3_Buffer[i] =0;
}
Uart3_Rx=0;
}
else
{
Uart3_Rx=0;
}
}
if(Uart3_Buffer[Uart3_Rx-1]=='D'||Uart3_Rx == Max_BUFF_Len)
{
UsartPrintf(USART_DEBUG, "进入D\r\n");
if(Uart3_Buffer[0]=='C')
{ UsartPrintf(USART_DEBUG, "进入C\r\n");
d.ddata[0]=Uart3_Buffer[1];
d.ddata[1]=Uart3_Buffer[2];
d.ddata[2]=Uart3_Buffer[3];
d.ddata[3]=Uart3_Buffer[4];
gpslatitude = d.cdata;
for(i=0;i<50;i++)
{
Uart3_Buffer[i] =0;
}
Uart3_Rx=0;
}
else
{
Uart3_Rx=0;
}
}
if(Uart3_Buffer[Uart3_Rx-1]=='F'||Uart3_Rx == Max_BUFF_Len)
{
if(Uart3_Buffer[0]=='E')
{
l=Uart3_Buffer[1];
k=Uart3_Buffer[2];
for(i=0;i<50;i++)
{
Uart3_Buffer[i] =0;
}
Uart3_Rx=0;
}
else
{
Uart3_Rx=0;
}
}
}
}
3、案列