亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
51單片機串口通信,發送字符串回顯不全
[打印本頁]
作者:
規劃胡
時間:
2026-1-22 20:27
標題:
51單片機串口通信,發送字符串回顯不全
#include "reg52.h"
#include <string.h>
typedef unsigned int u16;
typedef unsigned char u8;
// ====================== 字符串接收配置 ======================
#define RECV_BUF_LEN 32 // 接收緩存最大長度(可修改)
u8 recv_buf[RECV_BUF_LEN]; // 字符串接收緩存
u8 recv_index = 0; // 接收索引(記錄當前緩存位置)
//bit recv_complete = 0; // 字符串接收完成標志
bit recv_complete;
// ===========================================================
// 10us延時函數
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
// ms延時函數(兼容11.0592/12MHz)
void delay_ms(u16 m)
{
u16 i, j;
for(i = m; i > 0; i--)
for(j = 115; j > 0; j--);
}
// 串口初始化:適配兩種晶振的9600波特率
void uart_init(u8 baud_mode)
{
TMOD |= 0X20; // 定時器1模式2(8位自動重裝)
SCON = 0X50; // 串口模式1,允許接收
PCON = 0X00; // SMOD=0,降低波特率誤差
if(baud_mode == 0)
{
TH1 = 0XFD; // 11.0592MHz → 9600
TL1 = 0XFD;
}
else
{
TH1 = 0X66; // 12MHz → 9600
TL1 = 0X66;
}
ES = 1; // 開啟串口中斷
EA = 1; // 開啟總中斷
TR1 = 1; // 啟動定時器1
delay_10us(10); // 串口就緒延時
}
// 串口發送單個字節(帶超時容錯)
void uart_send_byte(u8 dat)
{
u16 timeout = 1000;
TI = 0;
SBUF = dat;
while(!TI && timeout--)
{
delay_10us(1);
}
TI = 0;
}
// 串口發送字符串(傳入字符串首地址)
void uart_send_string(u8 *str)
{
while(*str != '\0') // 遍歷到字符串結束符'\0'為止
{
uart_send_byte(*str); // 逐字節發送
str++; // 指針后移
delay_10us(1);
}
}
// 串口中斷函數:接收字符串(逐字節緩存,帶結束符判斷)
void uart() interrupt 4
{
u8 rec_data = 0;
if (RI) { // 僅處理接收中斷
RI = 0; // 清除接收標志
rec_data = SBUF; // 讀取當前字節
// 1. 結束符判斷(回車/換行視為字符串結束)
if(rec_data == '\r' || rec_data == '\n')
{
recv_buf[recv_index] = '\0'; // 補充字符串結束符
recv_complete = 1; // 置接收完成標志
recv_index = 0; // 重置索引,準備下次接收
}
// 2. 未到結束符且緩存未溢出 → 緩存字節
else if(recv_index < RECV_BUF_LEN - 1) // 留1位存'\0'
{
recv_buf[recv_index] = rec_data;
recv_index++; // 索引自增
}
// 3. 緩存溢出 → 重置(防程序異常)
else
{
recv_index = 0;
}
}
}
void main()
{
//u8 send_data = 0X30; // 主動發送的單個字符(數字0)
uart_init(0); // 11.0592MHz傳0,12MHz傳1
delay_ms(100); // 初始化就緒延時
memset(recv_buf, 0, RECV_BUF_LEN);
while(1)
{
// 1. 主動定時發送單個字符(保留原有功能)
//uart_send_byte(send_data);
//delay_ms(100);
// 2. 檢測到字符串接收完成 → 回發該字符串
if(recv_complete)
{
uart_send_string("收到字符串:"); // 提示語
if(strcmp((char*)recv_buf, "jj") == 0)
{
uart_send_string(recv_buf);
}
uart_send_string("\r\n");
delay_10us(1);
recv_complete = 0; // 清除完成標志
recv_index = 0;
memset(recv_buf, 0, RECV_BUF_LEN);
}
}
}
復制代碼
發送jj和發送加回車換行,uart_send_string(recv_buf);無法正常運行,但是取消串口助手的勾選加回車換行,輸入jj\0\n,則整個代碼正常運行,請大佬賜教!!!!
作者:
ydatou
時間:
2026-1-24 16:37
if(rec_data == '\r' || rec_data == '\n')
{
recv_buf[recv_index] = '\0'; // 補充字符串結束符
recv_complete = 1; // 置接收完成標志
recv_index = 0; // 重置索引,準備下次接收
}
復制代碼
問題可能在這,收到'\n'后,緩沖區為"\0j\0"
作者:
ydatou
時間:
2026-1-24 17:03
感覺串口發送沒必要超時容錯。發送失敗就只和你mcu配置不對相關,和其它無關。這個錯誤是必須處理的,容錯反而不好。串口發送部分建議用keil官方代碼。
char putchar (char c)
{
while (!TI);
TI = 0;
SBUF = c;
return (c);
}
#define uart_send_byte putchar
void uart_send_string(char *str)
{
while (*str != '\0') // 遍歷到字符串結束符'\0'為止
{
uart_send_byte(*str++); // 逐字節發送
}
}
復制代碼
作者:
ydatou
時間:
2026-1-24 17:24
ydatou 發表于 2026-1-24 16:37
問題可能在這,收到'\n'后,緩沖區為"\0j\0"
可以先判斷recv_complete再處理接受字符。
也可以收到結束符時,如ecv_index為0丟棄,否則存入緩存。
void uart_init(u8 baud_mode)
{
TMOD |= 0X20; // 定時器1模式2(8位自動重裝)
SCON = 0X50; // 串口模式1,允許接收
PCON = 0X00; // SMOD=0,降低波特率誤差
if (baud_mode == 0)
{
TH1 = 0XFD; // 11.0592MHz → 9600
TL1 = 0XFD;
}
else
{
TH1 = 0X66; // 12MHz → 9600
TL1 = 0X66;
}
ES = 1; // 開啟串口中斷
EA = 1; // 開啟總中斷
TR1 = 1; // 啟動定時器1
delay_10us(10); // 串口就緒延時
}
char putchar(char c)
{
while (!TI)
;
TI = 0;
SBUF = c;
return (c);
}
#define uart_send_byte putchar
void uart_send_string(char *str)
{
while (*str != '\0') // 遍歷到字符串結束符'\0'為止
{
uart_send_byte(*str++); // 逐字節發送
}
}
// 串口中斷函數:接收字符串(逐字節緩存,帶結束符判斷)
void uart() interrupt 4
{
u8 rec_data = 0;
if (RI)
{ // 僅處理接收中斷
RI = 0; // 清除接收標志
if (recv_complete)
return;
rec_data = SBUF; // 讀取當前字節
// 1. 結束符判斷(回車/換行視為字符串結束)
if (rec_data == '\r' || rec_data == '\n')
{
if (recv_index)
{
recv_buf[recv_index] = '\0'; // 補充字符串結束符
recv_complete = 1; // 置接收完成標志
recv_index = 0; // 重置索引,準備下次接收
}
}
// 2. 未到結束符且緩存未溢出 → 緩存字節
else if (recv_index < RECV_BUF_LEN - 1) // 留1位存'\0'
{
recv_buf[recv_index] = rec_data;
recv_index++; // 索引自增
}
// 3. 緩存溢出 → 重置(防程序異常)
else
{
recv_index = 0;
}
}
}
復制代碼
你這代碼比較大的問題是收到的字符串處理期間,不能正常接收字符串。
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1