【嵌入式UI】中英文字符显示方案

在嵌入式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);
}

想要个赞!!!

有想要购买心电、血压、呼吸机设备的,欢迎来咨询!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值