在嵌入式UI中,要显示很长来自上位机的中文。最初的协议的是传输UTF-8的字符,但是嵌入式设备不支持,只支持GBK。
能采取的方案就是:
utf-8->unicode->gbk
utf-8->unicode 可以采取程序计算的方式进行转换
unicode->gbk 则需要查表,方法可以用fatfs系统的src文件,文件接近200k
非常耗资源,果断放弃,让上位机直接传gbk格式的字符。
当接收到数据后,会发现字符串中有中文和英文,中文是两个字节,英文是1个字节。
要布局好看,就必须要限制每行的字数在合适的背景下。
gbk中文字符最高位是1
ascii字符的最高位是0
所以判断中英文如下:
buff[str_index] >> 7 & 1
收到的字符如下:
char buff[512] = "您的心电测量结果为窦性心律性心率过缓,平均心率为60次/分钟,测量时间2023年7月17日8点23分。高血压患者需定期监测血压,提倡您每周至少测量2-3次血压。";
想要每行显示的字符如下:
代码如下:
char str_temp[64];//每行的字体缓存
uint16_t str_index = 0;
uint16_t str_temp_index = 0;
int16_t str_count = 0;
uint16_t row_count = 0;//一行有多少个字
uint16_t row_count_max = 0;//行字数限制
uint8_t col_height = 0;//列高
uint8_t font_wight = 0;//字宽
uint8_t rows_counts = 0;//行数
uint8_t i = 0;
char buff[512] = "您的心电测量结果为窦性心律性心率过缓,平均心率为60次/分钟,测量时间2023年7月17日8点23分。"
"高血压患者需定期监测血压,提倡您每周至少测量2-3次血压。";
int main() {
font_wight = 16 * 2;
row_count_max = (480 - 80) / (font_wight);
str_count = strlen(buff);//检查数组的总长度
do {
row_count = 0;
str_temp_index = 0;
memset(str_temp, 0, sizeof(str_temp));
while(row_count < row_count_max*2){
if (buff[str_index] == '/0') {
break;
}
if (buff[str_index] >> 7 & 1) {
//中文
if (row_count_max*2-row_count<=1) {
break;
}
row_count += 2;
str_temp[str_temp_index++] = buff[str_index++];
str_temp[str_temp_index++] = buff[str_index++];
}
else {
row_count++;
str_temp[str_temp_index++] = buff[str_index++];
}
}
str_count -= row_count;
printf("%s\r\n", str_temp);
i++;
} while (str_count > 0);
}
想要个赞!!!
有想要购买心电、血压、呼吸机设备的,欢迎来咨询!!!