1. 出现问题记录如下:,下图一共两个错误,第一,IMSI重复打印,第二,IMSI:+ICCID:898523120
2. 分析代码,假定出错的代码是,这个函数是虚拟AT指令的回调处理函数
VOID vat_recv_handle(UINT8 *pData, UINT16 length)
{
if((length > 0) && (pData != NULL))
{
uart_recv_factory_test_callback(pData,length);
if(strstr(pData, VAT_IMEI_ACK))
{
vat_CmdCb_wimei(pData);
}
//qhq
再见下面的代码,其中的关键是pData这个指针,在第二个错误中,+IMSI后面本来应该是454006105166845,但是打印出来却是IMSI:+ICCID:898523120
那么推测,发送AT+CIMI读取IMSI的时候,调用了一次 vat_recv_handle,返回值是454006105166845 (就是pData)
发送AT+ICCID读取ICCID的时候,又调用了一次vat_recv_handle,返回值是+ICCID: 89852312078522009932 (也是第二次的 pData)
那么根据代码,只能
根据代码可以看出,应该是第二次的pData覆盖了第一次的pData数据,准确的来说,临界区没有保护,那么两种办法,第一在函数内部建立临时变量数据,复制进pData,第二延长两个AT指令之间的时间间隔。
3. 为了复现此现象,修改代码,延时时间从500Ms 改为100ms,看是否复现
void get_module_imsi(void)
{
uint8 getCnt = 0;
appSysTem.vat_ack_falg = 0;
while((appSysTem.vat_ack_falg == 0) && (getCnt < VAT_RESEND_NUM_MAX))
{
vat_send_handle(VAT_CIMI, sizeof(VAT_CIMI));
getCnt++;
iot_os_sleep(100);
}
}