由于Cat.4模块(EC20)功耗大,考虑到NB网络覆盖问题(设备在野外工作场景),因此项目上用选择了Cat.1(EC600N)模块,现在把调试过程总结下,希望能够帮助到大家。EC20使用总结请看:单片机和4G模块通信总结(EC20)。
一、电源
手册说供电电压≥3.4V,峰值电流3A。
二、通信口
UART和IO口都是1.8V,需要做电平准换。
三、开机顺序
我是上电1s后复位,复位低电平600ms,然后100ms后开机,开机等待10s后进行操作。
四、AT指令
采用消息地图原理,具体请看
《AT指令的一种解析想法》
《编程学习笔记之消息地图》
指令和Cat.4还是有些区别:
const static msg_t c_tMSGMap[] = {
{"ATE0\r\n", lte_4g_protocol_default_send},
{"ATE0\r\n", lte_4g_protocol_default_send},
{"ATE0\r\n", lte_4g_protocol_default_send},
{"ATE0\r\n", lte_4g_protocol_default_send},
{"AT+CPIN?\r\n", lte_4g_protocol_CPIN},
{"AT+CSQ\r\n", lte_4g_protocol_CSQ},
{"AT+CREG?\r\n", lte_4g_protocol_CREG},
//{"AT+CGREG?\r\n", lte_4g_protocol_CGREG},
// {"AT$MYNETCON", lte_4g_protocol_MYNETCON}, //设置APN
// {"AT$MYNETCON1", lte_4g_protocol_MYNETCON1}, //设置用户名和密码
{"AT+QICSGP", lte_4g_protocol_QICSGP}, //设置APN,用户名和密码
// {"AT$MYNETACT=0,0\r\n", lte_4g_protocol_MYNETACT}, //去激活
// {"AT$MYNETACT=0,1\r\n", lte_4g_protocol_default_send}, //激活
// {"AT$MYNETACT?\r\n", lte_4g_protocol_default_send}, //是否激活成功
{"AT+QIDEACT=1\r\n", lte_4g_protocol_MYNETACT}, //去激活
{"AT\r\n", lte_4g_protocol_default_send},
{"AT\r\n", lte_4g_protocol_default_send},
{"AT+QIACT=1\r\n", lte_4g_protocol_default_send}, //激活
{"AT+QIACT?\r\n", lte_4g_protocol_default_send}, //是否激活成功
// {"AT$MYNETSRV", lte_4g_protocol_MYNETSRV}, //配置服务器IP和端口号
{"AT+QICLOSE=0\r\n", lte_4g_protocol_MYNETCLOSE}, //关闭socket
{"AT+QIOPEN", lte_4g_protocol_QIOPEN}, //创建socket
// {"AT+QISTATE=1,0\r\n", lte_4g_protocol_default_send}, //查询连接状态
};
五、socket客户端操作
5.1通信模式
有三种通信模式:
5.2创建TCP客户端
指令执行流程如消息地图所示,其中AT+QIOPEN 打开Socket 服务。
六、数据发送与接收
6.1AT+QISEND 发送数据
说明:
1、此命令只有在缓存模式和直吐模式才有效;
2、此命令发送的是文本格式;
3、此命令需要等待响应‘>’后,再发送用户数据,然后发送<Ctrl+Z> ,发送数据;
6.2AT+QISENDEX 发送16 进制字符串数据
说明:
1、此命令在缓存模式下测试OK,其它模式未测试;
2、此命令支持16进制字符,即:
AT+QISENDEX=0,\"123456ABCDEFTG\"\r\n 返回错误
AT+QISENDEX=0,\"123456ABCDEF\"\r\n 正确,并且服务器收到0x12 0x34 0x56 0xAB 0xCD 0xEF
6.3AT+QIRD 读取收到的TCP/IP 数据
此模式只在缓存模式有用。
由于我的项目需要支持多种协议,既有RTU(16进制)协议,又有MQTT(文本)协议,因此我配置模块为透传模式。
接收处理如下:
//透明传输出错怎么处理?
static fsm_rt_t lte_4g_protocol_transparent_transmission_ack(uint8_t* pchBuffer,uint16_t hwSize)
{
uint16_t n=0;
if(NULL == pchBuffer || !hwSize){
return fsm_rt_err;
}
if(NULL != strstr((const char*)pchBuffer,"ERROR")){
POST_MAIL(&s_tLte4gAppBuffer.tMailBoxTemp,(void*)LTE_4G_MAIL_ERROR);
//printf("mail=%d\r\n",LTE_4G_MAIL_ERROR);
return fsm_rt_err;
}else if(NULL != strstr((const char*)pchBuffer,"CARRIER")){//检查到服务器断开
POST_MAIL(&s_tLte4gAppBuffer.tMailBoxTemp,(void*)LTE_4G_MAIL_ERROR);
return fsm_rt_err;
}
n=(s_tLte4gAppBuffer.hwAPPRxBufferSize+hwSize > UART_BUFFER_SIZE)? (UART_BUFFER_SIZE - s_tLte4gAppBuffer.hwAPPRxBufferSize): hwSize;
memcpy(s_tLte4gAppBuffer.chAPPRxBuffer+s_tLte4gAppBuffer.hwAPPRxBufferSize,pchBuffer,n);
if(eeprom_4g_rx_log_is_activate()){
uint16_t i=0;
for(i=0;i<n;i++){
log_in_hex(s_tLte4gAppBuffer.chAPPRxBuffer[s_tLte4gAppBuffer.hwAPPRxBufferSize+i]);
}
}
s_tLte4gAppBuffer.hwAPPRxBufferSize+=n;
POST_MAIL(&s_tLte4gAppBuffer.tMailBoxTemp,(void*)LTE_4G_MAIL_OK);
return fsm_rt_cpl;
}