久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
分享個自己寫的自定義串口協議 附單片機代碼
[打印本頁]
作者:
范莉萍
時間:
2024-6-12 11:07
標題:
分享個自己寫的自定義串口協議 附單片機代碼
最近在寫一個通過手控器控制設備動作的程序,手控器按鍵較多,所以通過串口來和外設設備進行通信,由于命令較多,所以做了個小協議以后也能用到,可做主機可做從機,適合近距離單機通訊,第二位功能碼可做地址組成多機通訊,但最好加上校驗位。新手入門,大佬請多多指教
附上代碼
//自定義串口發送協議 例:68 01 00 03 FF ,除去包頭包尾,中間為 功能碼,數據1,數據2
// 發送數據包函數 功能碼,第一位數據,第二位數據
void SendDataPacket(uint8_t function, uint8_t data1, uint8_t data2) {
// 發送包頭
USART1_SendData(PACKET_HEADER);
// 發送功能碼
USART1_SendData(function);
// 發送數據1和數據2
USART1_SendData(data1);
USART1_SendData(data2);
// 發送包尾
USART1_SendData(PACKET_TAILER);
}
void Anlsy_Data(uint8_t function, uint8_t data1, uint8_t data2)//所有按鍵接收解析在這里寫
{
if(function == KEY_STAUS)
{
SysChenyuan.mark = QX_MARK;
switch(data2)
{
case KEY1:
SysChenyuan.Uart_Comd = QX1;
printf("清洗1按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
case KEY2:
SysChenyuan.Uart_Comd = QX2;
printf("清洗2按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
case KEY3:
SysChenyuan.Uart_Comd = QX3;
printf("清洗3按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
case KEY_STOP:
SysChenyuan.all_stopped = YES;//停止標志
printf("停止按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
case KEY_CHONGSHUI:
SysChenyuan.QiTa = CHONGSHUI;//沖水標志
printf("沖水按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
case KEY_HONGGAN:
SysChenyuan.QiTa = HONGGAN;//烘干標志
printf("烘干按鍵按下,data2 = %02d,function = %02d", data2, function);
break;
default:
// 處理未知按鍵情況
break;
}
}
}
extern uint8_t Serial_Rx3Flag,time_out3,time_out3_flag;
// 解析數據包的函數
int ParseDataPacket(void) {
static uint8_t expectingHeader = 1; // 標記是否正在等待包頭
static uint8_t packetIndex = 0, i = 0; // 當前數據包內的索引
uint8_t function, data1, data2;
if(Serial_Rx3Flag == 1)
{
time_out3 = 0;
time_out3_flag = 0;
// 遍歷緩沖區中的所有數據(在實際情況中,你可能只處理新接收到的數據)
for ( i = 0; i < rxIndex; ++i) {
if (expectingHeader) {
if (rxBuffer[i] == PACKET_HEADER) {
expectingHeader = 0; // 找到了包頭,開始解析數據包
packetIndex = 0; // 重置數據包索引
}
// 如果不是包頭,則忽略該字節或進行錯誤處理
} else {
switch (packetIndex) {
case 0: // 功能碼
function = rxBuffer[i];
break;
case 1: // 數據1
data1 = rxBuffer[i];
break;
case 2: // 數據2
data2 = rxBuffer[i];
// 檢查包尾
if (rxBuffer[i+1] == PACKET_TAILER) {
// 完整的數據包已接收,可以處理數據
Anlsy_Data(function, data1, data2);
// processPacket(function, data1, data2);
// 重置狀態以接收下一個數據包
expectingHeader = 1;
packetIndex = 0;
rxIndex = 0; // 清除緩沖區(或者只清除已處理的部分)
} else {
// 沒有找到包尾,可能是數據損壞或丟失,進行錯誤處理
// TODO: 錯誤處理代碼
expectingHeader = 1; // 重置狀態以接收下一個數據包
packetIndex = 0;
}
break;
default:
// 無效的數據包索引,進行錯誤處理
expectingHeader = 1; // 重置狀態以接收下一個數據包
packetIndex = 0;
break;
}
if (packetIndex < 3) { // 還未到達包尾,遞增索引
packetIndex++;
}
}
}
rxIndex = 0;// 清除已處理的數據(如果rxIndex不是自動管理的)
Serial_Rx3Flag = 0;
}
return 0; // 返回值可以根據需要來定義,例如表示是否成功解析了一個數據包
}
//下面是串口超時代碼,我放在了10ms定時器里,看需要。
// 定時器回調函數 10ms
void vTimerCallback( TimerHandle_t xTimer )
{
if(time_out3 < 10 && time_out3_flag == 1) {
time_out3++;
}
// 檢查是否超時
if(time_out3 >= 10) {
time_out3 = 0;
time_out3_flag = 0;
// 執行超時處理,例如發送確認信息或者進行數據處理
Serial_Rx3Flag = 1;
}
}
//串口中斷
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET) //RXNE 標志位為1 表示可以接收數據
{
uint8_t ucReceivedChar;
// 讀取接收到的字符
ucReceivedChar = USART_ReceiveData(USART1);
if (rxIndex < RX_BUFFER_SIZE) {
rxBuffer[rxIndex++] = ucReceivedChar;
time_out3 = 0;
time_out3_flag = 1;
}
// if(Serial_Rx3Flag == 1)
// {
// rxIndex = 0;
// }
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除RXNE標志位
}
}
復制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日本亚洲欧美
|
国产精品美女久久久久久久久久久
|
羞羞视频网站免费看
|
久久99精品久久久久蜜桃tv
|
99免费视频
|
91精品国产92
|
国产免费一区二区三区
|
国产精品久久9
|
亚洲3级
|
欧美精品一级
|
欧美一级毛片久久99精品蜜桃
|
福利视频一区二区三区
|
国产欧美一区二区三区另类精品
|
久久人爽
|
亚洲国产成人久久综合一区,久久久国产99
|
久久免费高清视频
|
久久久久亚洲精品
|
2020国产在线
|
国产精品久久
|
91久久久久久久
|
久久亚洲综合
|
亚洲视频精品在线
|
操久久
|
午夜小视频在线观看
|
蜜桃传媒av
|
99精彩视频
|
欧洲色
|
国产一级免费在线观看
|
午夜视频在线播放
|
日韩一区二区三区在线观看视频
|
欧美舔穴
|
中国一级特黄毛片大片
|
国产视频一区二区
|
日韩三级在线
|
免费看黄视频网站
|
日韩毛片免费视频
|
久久久久久国产精品
|
日本精品视频一区二区
|
在线亚洲一区
|
精品欧美黑人一区二区三区
|
亚洲一区二区中文字幕在线观看
|