多任务处理项目架构搭建
/*
定时器计时5秒钟采集一遍数据(机具号、角度传感器、传感器2、打捆传感器、霍尔传感器)
SD卡 服务器连接时,有网:1、有数据就上传。2、没有数据就直接上传。 ;;没网:数据保存到SD卡里
GPS输出1秒钟1次
LCD刷新2秒一次
双摄像头 摄像头1 2.5分钟一次、摄像头2 5分钟一次 采集一次
GPRS 数据上传 MQTT 工作数据(传感器和GPS)HTTP 图片数据(摄像头1 图片1、摄像头2 图片2)
串口DEBUG信息打印
*/
/*
Time2:HAL_TIM_PeriodElapsedCallback//定时10ms
{
#if DEBUG_printf_test
printf("定时1秒钟:%d",1s_time_count);
#else
#endif
//定时器,时钟定时
if (htim->Instance == htim2.Instance)
{
if(Usart1_Type.RX_IDLE_Usart1_flag) // Receive flag,中断接收到串口数据
{
Usart1_Wait_Time++;
if(Usart1_Wait_Time > 10)//串口接收超时100ms
{
Usart1_Wait_Time = 0; //清除串口接收计时
Usart1_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
}
}
if(Usart2_Type.RX_IDLE_Usart2_flag) // Receive flag,中断接收到串口数据
{
Usart2_Wait_Time++;
if(Usart2_Wait_Time > 10)//串口接收超时100ms
{
Usart2_Wait_Time = 0; //清除串口接收计时
Usart2_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
}
}
if(Usart3_Type.RX_IDLE_Usart1_flag) // Receive flag,中断接收到串口数据
{
Usart3_Wait_Time++;
if(Usart3_Wait_Time > 10)//串口接收超时100ms
{
Usart3_Wait_Time = 0; //清除串口接收计时
Usart3_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
}
}
if(Usart4_Type.RX_IDLE_Usart1_flag) // Receive flag,中断接收到串口数据
{
Usart4_Wait_Time++;
if(Usart4_Wait_Time > 10)//串口接收超时100ms
{
Usart4_Wait_Time = 0; //清除串口接收计时
Usart4_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
}
}
if(Usart5_Type.RX_IDLE_Usart1_flag) // Receive flag,中断接收到串口数据
{
Usart5_Wait_Time++;
if(Usart5_Wait_Time > 10)//串口接收超时100ms
{
Usart5_Wait_Time = 0; //清除串口接收计时
Usart5_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
}
}
}
}
*/
/*
GPS定位单独一个线程
1、配置GPS连接,2、接收和解析GPS数据,3、10秒内最新GPS数据
{
Init_GPS();//first_Init_falg = 0;//开机初始化,在规定时间内,没有初始化成功,再次初始化。
GPS接收NVIC
//USART DMA 空闲中断回调函数
void Usart_Receive_IDLE(UART_HandleTypeDef *huart)
{
//DMA 空闲中断接收
if(RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) //判断是否是空闲中断
{
if(huart->Instance == USART1)//RS485 AB1
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清楚空闲中断标志(否则会一直不断进入中断)
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
Usart1_Type.RX_Usart1_Size = RX_Usart1_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//计算接收到的数据长度
Usart1_Wait_Time = 0; //清除串口接收计时
Usart1_Type.RX_IDLE_Usart1_flag = 1; //跳出中断接收,到主程序里处理接收数据
HAL_UART_Receive_DMA(&huart1, &Usart1_Type.RX_Usart1_pData[Usart1_Type.RX_Usart1_Size], (RX_Usart1_LEN - Usart1_Type.RX_Usart1_Size));//重启开始DMA
}
else if(huart->Instance == USART2)
{
}
}
}
GPS接收RX
void Usart1_User_Receive(void)
{
if(Usart1_Type.RX_IDLE_Usart1_flag) // Receive flag,中断接收到串口数据
{
if(Usart1_Wait_Timeout_Flag == 1)//接收数据超时,完成接收
{
Usart1_Wait_Timeout_Flag = 0;//清除超时标志位
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
Usart1_Type.RX_Usart1_Size = RX_Usart1_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//计算接收到的数据长度
HAL_UART_Receive_DMA(&huart1, Usart1_Type.RX_Usart1_pData, RX_Usart1_LEN);//重启开始DMA传输 每次255字节数据
Usart1_Type.RX_IDLE_Usart1_flag = 0; // clean flag
Usart1_Type.RX_Usart1_flag = 1;//完成接收标志位
}
}
}
void Usart1_RX_Analy(void)
{
if(Usart1_Type.RX_Usart1_flag == 1)//完成接收标志位
{
Usart1_Type.RX_Usart1_flag = 0;
//My_UART_Transmit(&huart5, Usart1_Type.RX_Usart1_pData, Usart1_Type.RX_Usart1_Size,30);//发送收到的数据
//#define GPS_Online 1 //GPS在线
//#define GPS_Offline 0 //GPS离线
查看GPS数据长度是否完整;
if(GPS_length >= XX)
{
GPS_status = GPS_Online;//GPS在线
first_Init_falg = 1;//开机初始化成功
GPS_status_Offline_count = 0;
// memcpy( GPS_5s_Data, Usart1_Type.RX_Usart1_pData, Usart1_Type.RX_Usart1_Size);
// if(GPS_Analyze_Time_flag == 1)//5秒内有完整GPS数据,解析其中一个数据
// {
// GPS_Analyze_Time_flag = 0;
// 解析GPS数据并保存;
char *p;
p = strchr((char*)Usart1_Type.RX_Usart1_pData,'$');
GPS_Analyze(p);
// }
}
else
{
GPS_status = GPS_Offline;//GPS离线
GPS_status_Offline_count++;
//#define GPS_Again_Init 100 //3分钟初始化失败
//#define GPS_Offline_count 10 //离线次数10次
if(first_Init_falg == 0)//开机初始化失败
{
if(GPS_status_Offline_count >= GPS_Again_Init)
{
Init_GPS();//重新初始化
}
return;//同时返回
}
if(GPS_status_Offline_count >= GPS_Offline_count)
{
LCD显示屏输出GPS离线;
}
}
CLean_RX_Usart1_pData();//清空GPRS 串口USART1缓存数据
}
}
void CLean_RX_Usart1_pData(void)
{
HAL_UART_DMAStop(&huart1); //停止本次DMA传输
Usart1_Type.RX_Usart1_Size = 0;
memset(Usart1_Type.RX_Usart1_pData,0,sizeof(Usart1_Type.RX_Usart1_pData));
HAL_UART_Receive_DMA(&huart1, Usart1_Type.RX_Usart1_pData, RX_Usart1_LEN);//重启开始DMA传输 每次255字节数据
}
GPS接收TX
}
*/
/*
传感器采集数据单独一个线程
1、配置传感器参数{使能工作传感器},2、定时采集总线传感器数据,3、将采集传感器数据+GPS数据解析后保存到缓存空间{链表或队列};
uint8_t Sensor_enble = 0;
void Usart1_User_Send(void)
{
//节拍数时间:279 超时:400ms
//传感器读取:条件1:打开5V使能电源;2:使能发送和接收引脚
//读取第几个传感器
//if(Sensor_enble)
{
Sensor_enble = 0;
if(Usart1_485Tx_Rx == 0)//发送接收完成;超时等
{
Usart1_Rx_overtime_count = 3;//传感器超时读取次数5次
//Sensor_Cmd_send(_1anglesensorcmd , sizeof(_1anglesensorcmd));//发送读取传感器数据指令
if(Sensor_Cod == 1)//传感器1角度值 计算深度 节拍数时间:279
{
Sensor_Cmd_send(_1anglesensorcmd , sizeof(_1anglesensorcmd));//发送读取传感器数据指令
}
else if(Sensor_Cod == 2)//传感器2角度值 直接传角度 节拍数时间:279
{
Sensor_Cmd_send(_2anglesensorcmd , sizeof(_2anglesensorcmd));//发送读取传感器数据指令
}
else if(Sensor_Cod == 3)//获取打捆传感器的数据 节拍数时间:279
{
Sensor_Cmd_send(_3anglesensorcmd , sizeof(_3anglesensorcmd));//发送读取传感器数据指令
}
else if(Sensor_Cod == 10)//获取传感器ID 节拍数时间:279
{
Sensor_Cmd_send(_10anglesensorcmd , sizeof(_10anglesensorcmd));//发送读取传感器数据指令
}
}
}
}
void Sensor_User_Send(void)
{
uint8_t Open_Sensor = 1;
if(Open_Sensor)
{
Sensor_enble = 1;
}
else
{
Sensor_enble = 0;
}
}
void Usart1_RX_Analy(void)
{
if(Usart1_Type.RX_Usart1_flag == 1)//完成接收
{
char *p;
p = strchr((char*)Usart1_Type.RX_Usart1_pData,'U');
EIR_Reply(p);
CLean_RX_Usart1_pData();//清空GPRS 串口USART2缓存数据
}
}
void Sensor_User_Handle(void)
{
Usart1_RX_Analy();
Sensor_User_Send();
}
void Usart1_User_Handle(void)
{
Usart1_User_Receive();
Usart1_RX_Analy();
Usart1_User_Send();
}
*/
//单片机处理FATFS文件速度很快,串口发送EC20到缓存速度很慢(获取较大的缓存数组加快速度)。
/*
SD卡单独一个线程
1、GPS定位数据解析后存储
2、传感器采集数据 + gps定位数据解析 ==》缓存空间{链表或队列} 存储到SD卡
3、摄像头图片数据获取和解析后存储{分段获取图片数据}
4、GPRS接收数据进行存储
*/
/*
双摄像头单独一个线程//100K
1、配置摄像头参数,2、定时采集图片数据,
*/
/*
GPRS单独一个线程
1、配置GPRS AT指令,2、激活PDP附着网络PING服务器,3、定时检测信号强度和网络状态
1、MQTT连接服务器,2、定时查看MQTT状态,3、MQTT工作数据上传,4、MQTT数据接收。
1、配置语音参数, 2、准备语音播报{语音播报不能收发数据}
1、配置HTTP参数, 2、HTTP上传图片数据{上传期间GPRS不能收发数据}
1、初始化
GPRS_AT_Init();//初始化GPRS
Audio_playback("\"开机\"");
GPIOC->BRR = GPIO_Pin_15;//VCCOUTon
vTaskDelay(4000);
LCD_DisplayGB32_32(145,112,BLACK,WHITE,"正在获取机具号");
while(!get_Sensor_id())//读取机具号传感器
Special_Model_IDreadSeekfromFlash();//读特殊模式的ID
Camera_Configuration_initialization();
if(MQTT_Land()==1)
//循环测试远程升级
MQTT_POST_version();//上传文件名和版本号
MQTT_Get_Mode();
*/
/*
LCD 一个线程
1、初始化UI界面,2、定时刷新UI界面,3、UI界面数据实时更新
main_test(); //测试主界面
Test_Color(); //简单刷屏填充测试
Test_FillRec(); //GUI矩形绘图测试
Test_Circle(); //GUI画圆测试
English_Font_test();//英文字体示例测试
Chinese_Font_test();//中文字体示例测试
Pic_test(); //图片显示示例测试
osDelay(1);
*/