当前位置: 首页 > wzjs >正文

买了域名之后如何做网站长乐建设局网站

买了域名之后如何做网站,长乐建设局网站,国内新闻最新消息2021,快速软件开发平台摩斯密码(Morse Code)是一种通过点(.)和划(-)组合来表示字符的编码系统。下面我将在esp32上实现摩斯密码的输入,并能够发送到mqtt的broker。 先捋一下逻辑,首先esp32的按键已经编写了短按与长按功能,这将是输出摩斯密码点和划的基础。然后当2…

        摩斯密码(Morse Code)是一种通过点(.)和划(-)组合来表示字符的编码系统。下面我将在esp32上实现摩斯密码的输入,并能够发送到mqtt的broker。

        先捋一下逻辑,首先esp32的按键已经编写了短按与长按功能,这将是输出摩斯密码点和划的基础。然后当2s没有新输入,我们就认为输入完了一个字符,自动识别即可。但是怎么发送到mqtt呢?我打算选用一种摩斯密码里没有的,并且又容易记忆的字符——6个点。

        于是逻辑图如下:有了逻辑,编写代码就很容易了。

        先编写一个密码表:

// 摩尔斯码表 - 常见字符
static const struct
{char character;const char *morse;
} morse_table[] = {{'A', ".-"},{'B', "-..."},{'C', "-.-."},{'D', "-.."},{'E', "."},{'F', "..-."},{'G', "--."},{'H', "...."},{'I', ".."},{'J', ".---"},{'K', "-.-"},{'L', ".-.."},{'M', "--"},{'N', "-."},{'O', "---"},{'P', ".--."},{'Q', "--.-"},{'R', ".-."},{'S', "..."},{'T', "-"},{'U', "..-"},{'V', "...-"},{'W', ".--"},{'X', "-..-"},{'Y', "-.--"},{'Z', "--.."},{'0', "-----"},{'1', ".----"},{'2', "..---"},{'3', "...--"},{'4', "....-"},{'5', "....."},{'6', "-...."},{'7', "--..."},{'8', "---.."},{'9', "----."},{' ', "/"},  // 空格用"/"表示{'\0', NULL} // 结束标记
};

        定义摩斯密码的输入状态与输入类型。

// 摩尔斯码输入状态
typedef enum
{MORSE_IDLE,         // 空闲状态MORSE_INPUT,        // 输入中MORSE_CHAR_COMPLETE // 字符输入完成
} morse_state_t;// 摩尔斯码输入类型
typedef enum
{MORSE_DOT,  // 点 (.)MORSE_DASH, // 划 (-)MORSE_GAP   // 间隔 (表示字符结束)
} morse_input_t;

        编写宏定义与变量

#define MORSE_CHAR_TIMEOUT 2000 // 字符超时时间(毫秒)
#define MORSE_MAX_BUFFER 32     // 最大缓冲区大小。限制当前正在输入的摩尔斯码序列(点和划)的最大长度
#define MORSE_OUTPUT_MAX 64     // 输出缓冲区最大大小。限制已解码文本的最大长度// 当前摩尔斯码输入
static morse_state_t morse_state = MORSE_IDLE;//跟踪摩尔斯码输入的当前状态
static char current_morse[MORSE_MAX_BUFFER] = {0};//存储当前正在输入的摩尔斯码序列
static char decoded_text[MORSE_OUTPUT_MAX] = {0};//存储已解码的完整文本
static int64_t last_input_time = 0;//记录最后一次用户输入的时间戳(毫秒)。用于检测输入超时,实现自动字符完成功能。通过与当前时间比较,判断是否超过了MORSE_CHAR_TIMEOUT

        相应的编写各种功能函数:

// 获取当前时间戳(毫秒)
static int64_t get_current_time_ms(void)
{return esp_timer_get_time() / 1000;
}// 初始化摩尔斯码模块
void morse_init(void)
{morse_reset();
}// 添加一个摩尔斯码符号
void morse_add_symbol(morse_input_t symbol)
{size_t len = strlen(current_morse);// 防止缓冲区溢出if (len >= MORSE_MAX_BUFFER - 2){return;}// 添加符号switch (symbol){case MORSE_DOT:current_morse[len] = '.';current_morse[len + 1] = '\0';break;case MORSE_DASH:current_morse[len] = '-';current_morse[len + 1] = '\0';break;case MORSE_GAP:// 解码当前字符char decoded = morse_decode_current();if (decoded != '\0'){size_t decoded_len = strlen(decoded_text);if (decoded_len < MORSE_OUTPUT_MAX - 1){decoded_text[decoded_len] = decoded;decoded_text[decoded_len + 1] = '\0';}}// 重置当前输入current_morse[0] = '\0';break;}// 更新状态和时间戳morse_state = (symbol == MORSE_GAP) ? MORSE_CHAR_COMPLETE : MORSE_INPUT;last_input_time = get_current_time_ms();
}// 检查是否需要完成当前字符
bool morse_check_timeout(int64_t current_time)
{// 如果有输入且超时,则完成当前字符if (morse_state == MORSE_INPUT &&strlen(current_morse) > 0 &&(current_time - last_input_time) > MORSE_CHAR_TIMEOUT){morse_add_symbol(MORSE_GAP);return true;}return false;
}// 解码当前的摩尔斯码
char morse_decode_current(void)
{if (strlen(current_morse) == 0){return '\0';}// 尝试在摩尔斯码表中查找for (int i = 0; morse_table[i].morse != NULL; i++){if (strcmp(current_morse, morse_table[i].morse) == 0){return morse_table[i].character;}}// 如果找不到匹配项return '?';
}// 重置摩尔斯码输入
void morse_reset(void)
{morse_state = MORSE_IDLE;current_morse[0] = '\0';decoded_text[0] = '\0';last_input_time = get_current_time_ms();
}// 获取当前摩尔斯码字符串
const char *morse_get_current(void)
{return current_morse;
}// 获取已解码的字符串
const char *morse_get_decoded(void)
{return decoded_text;
}// 为显示准备摩尔斯码和解码结果
void morse_prepare_display(char *buffer, int size)
{// 拼接解码结果和当前输入的摩尔斯码snprintf(buffer, size, "解码: %s\n当前: %s",strlen(decoded_text) > 0 ? decoded_text : "[空]",strlen(current_morse) > 0 ? current_morse : "[等待输入]");
}// 检查当前输入是否为6个连续的点
bool morse_is_six_dots(void)
{// 检查当前输入是否为"......"(6个点)if (strlen(current_morse) == 6){// 逐个检查是否都是点for (int i = 0; i < 6; i++){if (current_morse[i] != '.'){return false;}}return true;}return false;
}

        在主函数调用先调用初始化。
 

 // 初始化摩尔斯码模块morse_init();

        在while循环里面,首先加入超时处理机制,2s没有再输入便直接解码,并在屏幕上显示。

// 获取当前时间int64_t current_time = esp_timer_get_time() / 1000;// 检查摩尔斯码输入超时if (current_mode == MODE_MORSE){if (morse_check_timeout(current_time)){// 超时处理,更新显示char morse_display[128];morse_prepare_display(morse_display, sizeof(morse_display));clear_text_area(lcd_buffer, LCD_H_RES, LCD_V_RES);draw_string(lcd_buffer, 0, 0, "摩尔斯电码模式", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT + 2, morse_display, 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 4 + 8, "短按: 输入点(.)", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 5 + 10, "长按: 输入划(-)", 0xFFFF, LCD_H_RES);esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, LCD_H_RES, LCD_V_RES, lcd_buffer);}}

        在按键短按的触发函数里面,按照前面的逻辑框图写带代码:先加入一个点,在判断是不是特殊消息(6个点),是的话直接用mqtt发送目前解析好的字符串,并重置,在屏上显示消息。如果不是,则正常更新显示,等待下一个输入。

// 短按输入"点"(.)morse_add_symbol(MORSE_DOT);// 检查是否为连续6个点if (morse_is_six_dots() && mqtt_connected){// 发送解码后的摩尔斯码消息到MQTTchar message[50];const char *decoded = morse_get_decoded();// 如果有解码结果,发送它,否则发送当前的摩尔斯码符号if (strlen(decoded) > 0){sprintf(message, "Morse: %s", decoded);}else{sprintf(message, "Morse: ......");}esp_mqtt_client_publish(mqtt_client, MQTT_PUBLISH_TOPIC, message, 0, 1, 0);// 重置摩尔斯码输入并显示发送成功信息morse_reset();clear_text_area(lcd_buffer, LCD_H_RES, LCD_V_RES);draw_string(lcd_buffer, 0, 0, "摩尔斯电码模式", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT + 2, "信号已发送", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 4 + 8, "短按: 输入点(.)", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 5 + 10, "长按: 输入划(-)", 0xFFFF, LCD_H_RES);esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, LCD_H_RES, LCD_V_RES, lcd_buffer);// 延迟1秒让用户看到发送成功消息vTaskDelay(1000 / portTICK_PERIOD_MS);}else{// 正常更新显示char morse_display[128];morse_prepare_display(morse_display, sizeof(morse_display));clear_text_area(lcd_buffer, LCD_H_RES, LCD_V_RES);draw_string(lcd_buffer, 0, 0, "摩尔斯电码模式", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT + 2, morse_display, 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 4 + 8, "短按: 输入点(.)", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 5 + 10, "长按: 输入划(-)", 0xFFFF, LCD_H_RES);esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, LCD_H_RES, LCD_V_RES, lcd_buffer);}

        长按直接添加划,并更新显示就好了。

// 长按输入"划"(-)morse_add_symbol(MORSE_DASH);// 更新显示char morse_display[128];morse_prepare_display(morse_display, sizeof(morse_display));clear_text_area(lcd_buffer, LCD_H_RES, LCD_V_RES);draw_string(lcd_buffer, 0, 0, "摩尔斯电码模式", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT + 2, morse_display, 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 4 + 8, "短按: 输入点(.)", 0xFFFF, LCD_H_RES);draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 5 + 10, "长按: 输入划(-)", 0xFFFF, LCD_H_RES);esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, LCD_H_RES, LCD_V_RES, lcd_buffer);break;

        ok,代码写完了,让我们试试效果。

        收到了。


文章转载自:

http://mAuf8C7r.knsmh.cn
http://VSfnkDNs.knsmh.cn
http://qnrltRJr.knsmh.cn
http://zEY4LvVi.knsmh.cn
http://KXljzr2E.knsmh.cn
http://oQsNAr54.knsmh.cn
http://ciQKApYI.knsmh.cn
http://1gaQpLUc.knsmh.cn
http://nrQlf9L9.knsmh.cn
http://ux0Do4lQ.knsmh.cn
http://0quGVxe2.knsmh.cn
http://jl5FUbZt.knsmh.cn
http://W8zQxAT7.knsmh.cn
http://SxtxwIsZ.knsmh.cn
http://0NsMzPHj.knsmh.cn
http://4wZdHwXN.knsmh.cn
http://WOWSy3uC.knsmh.cn
http://xccoXIWE.knsmh.cn
http://bR9ez4tB.knsmh.cn
http://u69hf2HO.knsmh.cn
http://lNWDXLO2.knsmh.cn
http://nCpRVBxj.knsmh.cn
http://iaVCMygi.knsmh.cn
http://eJq3pgBk.knsmh.cn
http://W3c5EvFz.knsmh.cn
http://1KCUsKCC.knsmh.cn
http://rgsXo7Xs.knsmh.cn
http://ezuYoEjL.knsmh.cn
http://GhgoB4Z4.knsmh.cn
http://W74FKlXm.knsmh.cn
http://www.dtcms.com/wzjs/626675.html

相关文章:

  • 济宁有做企业网站吗新闻app开发公司
  • 可以做婚礼鲜花布置的网站dw怎么做网站跳转
  • 呼和浩特 网站建设上海做网站哪个好
  • 建营销型网站餐饮品牌设计方案
  • 网站如何做快捷支付如何做汽车的创意视频网站
  • 网站架构文案wordpress 伪静态 文章打不开
  • 做网站需要多少宁波企业网站搭建特点
  • 如何避免网站被攻击织梦制作wap网站
  • 上海网站建设赢昶互联网百强企业排名
  • 网站内容授权书服装设计投稿平台有哪些
  • 杭州网站建设公司排行甘肃省城乡建设局网站
  • 珠海 电商 网站建设网站版权备案
  • 去哪儿网站建设需要哪些技术正品手表官网
  • 建网站需要花哪些钱医学ppt模板免费下载网站
  • 电子商务网站开发系统平台flash网站整站源码免费下载
  • 电商类网站开发项目书wordpress里的发消息给我
  • 做网站销售是干什么的优化wordpress后台速度
  • 网站跳出率高的原因大型网站建设建站模板
  • 网站建设的新闻网站开发与技术维护
  • CQ网站建设网站开发后端待遇
  • 无锡网站设计哪家公司好网络专题策划书模板
  • 做简历那些网站比较好广告网站建设及推广
  • 免费做淘客cms网站视频推广软件排名帝搜软件
  • 企业网站搜索优化个人怎么制作公众号
  • 网站建设周志200字深圳注册公司地址可以是住宅吗
  • 长春网站优化页面培训网站方案
  • 自建网站怎么做后台管理系统柯城建设局网站
  • 做电影网站如何规避版权加快信用网站建设
  • 德清县小城镇建设网站怎么在vk网站上做推广
  • 海南网站建设推广公司哪家好网站建设深圳哪里学