一, AT指令发送中文
1,AT+CMGF=0\r\n(发送unicode)
2,AT+CMGS=19\r\n (来自于第三条指令字节数)
3,0011000D91689542371693F30008FF046D4B8BD5\r\n
4,0x1A
这个是转换函数
格式如下 ,函数只需要填写号码和内容即可。
0011000D9168+号码F(奇偶位互换)+0008FF+ 字节数(例:04)+内容
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>
const char *input = "13855325423"; // 11位号码 接收短信的号码
char Lowdata[] = "测试12.3";//短信内容
char output_array[512];
void processNumber(char *output) {
strcpy(output, input);
output[11] = 'F';
output[12] = '\0';
for (int i = 0; i < 11; i += 2) {
char temp = output[i];
output[i] = output[i + 1];
output[i + 1] = temp;
}
}
char convert_to_unicode(char* chinese_array) {
char output_str[256][9]; // 256个字符,每个字符的Unicode码为9字节
memset(output_str, 0, sizeof(output_str)); // 初始化数组
memset(output_array, 0, sizeof(output_array)); // 初始化输出数组
// 设置本地环境为UTF-8以支持中文字符
setlocale(LC_CTYPE, "en_US.UTF-8");
wchar_t wchar_buffer[256]; // 宽字符缓冲区
// 使用mbstowcs将多字节字符转换为宽字符
size_t len = mbstowcs(wchar_buffer, chinese_array, sizeof(wchar_buffer) / sizeof(wchar_t));
if (len == (size_t)-1) {
return -1; // 转换失败
}
// 将每个宽字符转为Unicode格式并存储到output_str数组中
for (size_t i = 0; i < len; i++) {
snprintf(output_str[i], sizeof(output_str[i]), "%04X", wchar_buffer[i]);
}
// 将二维数组output_str中的数据拼接成一维数组output_array
int pos = 0;
for (size_t i = 0; i < len; i++) {
// 计算当前字符串的长度
int str_len = strlen(output_str[i]);
// 检查剩余空间是否足够
if (pos + str_len >= sizeof(output_array)) {
break; // 缓冲区不足
}
// 复制字符串到output_array
strcpy(output_array + pos, output_str[i]);
pos += str_len;
}
output_array[pos] = '\0'; // 确保字符串以null结尾
return pos/2; // 返回实际写入的字节数
}
void int_to_str(int num, char *str) {
int i = 0;
int is_negative = 0;
// 处理负数
if (num < 0) {
is_negative = 1;
num = -num;
}
// 逐位转换(反向存储)
do {
str[i++] = num % 10 + '0';
num /= 10;
} while (num > 0);
// 添加负号
if (is_negative) {
str[i++] = '-';
}
str[i] = '\0';
// 反转字符串
int len = strlen(str);
for (int j = 0; j < len / 2; j++) {
char temp = str[j];
str[j] = str[len - 1 - j];
str[len - 1 - j] = temp;
}
}
int main() {
char resultnum[13]; // 存储处理后的号码(11位 + 'F' + '\0' = 13)
char unicode_str[100]; // 足够存储"\u4F60\u597D"
int Sum=0;
processNumber(resultnum);//号码
char result = convert_to_unicode(Lowdata);//内容
Sum = 15+result;
// 拼接 "0011000D9168" 和 result
char final_result[512] = "0011000D9168";
strcat(final_result, resultnum); // 0011000D9168+号码
strcat(final_result, "0008FF"); // 0011000D9168+号码+0008FF
char c_result[10];
sprintf(c_result,"%02X",result);
strcat(final_result, c_result); // 0011000D9168+号码+0008FF+字节数
strcat(final_result, output_array); //0011000D9168+号码+0008FF+字节数+内容
printf("AT+CMGF=0\r\n");
printf("AT+CMGS=%d\r\n",Sum);
printf("%s\r\n",final_result);
printf("%X",0x1A);
return 0;
}