系列文章目录
前言
这次文章记录的是平时支持客户openCPU遇到的功能问题,基本上都是基础的知识,记录下来就是为了提升经验,一些几年的工程师都会犯的错误。
一、文件系统的访问模式
问题错误:客户在模块开机直接对不存在的文件进行open和read操作,导致open和read操作失败错误示例如下:
记录点:面对不存在文件时要先进行写,以写的方式打开文件(如果文件存在则会清空文件,如果文件不存在则会创建文件)
示例如下:
if (flag_value & TASK_TIMER_CHANGE_FLAG_BIT) {
fd = FDI_fopen("test_file", "wb");
if (fd != 0){
sdk_uart_printf("debug> open file for write OK\n");
memset(temp, 0, 30);
sprintf(temp,"Hello world! _%d",count);
FDI_fwrite(temp, 20, 1, fd);
FDI_fclose(fd);
} else {
sdk_uart_printf("debug> open file for write error\n");
}
} else if (flag_value & TASK_TIMER_CHANGE2_FLAG_BIT) {
fd = FDI_fopen("test_file", "rb");
if (fd) {
sdk_uart_printf("debug> open file for read OK\n");
memset(temp,0,30);
FDI_fread(temp,30,1,fd);
FDI_fclose(fd);
sdk_uart_printf("debug> temp = %s", temp);
} else {
sdk_uart_printf("debug> open file for read error\n");
}
}
二、tcp重连机制
代码如下(示例):
if (sock < 0) {
sdk_uart_printf("_testsocket: connect error");
return;
}
ret = send(sock, "abcdefg", 7, 0);
if (ret != 7) {
sdk_uart_printf("_testsocket: send error");
close(sock);
return;
}
FD_ZERO(&master);
FD_ZERO(&read_fds);
FD_SET(sock, &master);
read_fds = master;
if(select(fdmax, &read_fds, NULL, NULL, NULL) == -1) {
fatal_printf("%s[%d], select error %d", __FUNCTION__,0,errno);
OSATaskSleep(200);
}
//使用堵塞机制判断接收从而达到重连效果
ret = recv(sock, buf, sizeof(buf) - 1, 0);
if (ret <= 0) {
sdk_uart_printf("_testsocket: recv error: %d", ret);
close(sock);
return;
}
buf[ret] = '\0';
sdk_uart_printf("_testsocket: data: %s", buf);
close(sock);
三、双卡切换
客户使用双卡功能切换卡之后,切换后的卡显示无信号状态但是网络可以注册,问题复现情况:
卡切换之后需要初始化,可以等初始化结束之后,信号才会显示,可以加在注册之后
设置主卡副卡代码如下:
ret = getMasterSimID();//获取当前主卡信息
catstudio_printf("%s: getMasterSimID ret %d\n",__FUNCTION__,ret);
if (isMasterSim0()){//判断卡查询注册状态
ret = SendATCMDWaitResp(TEL_AT_CMD_ATP_10, at_str, 3, NULL,1,NULL, resp_str, sizeof(resp_str));
}else{
ret = SendATCMDWaitResp(TEL_AT_CMD_ATP_10+36, at_str, 3, NULL,1,NULL, resp_str, sizeof(resp_str));
}
catstudio_printf("%s: resp_str = %s, ret = %u\n",__FUNCTION__,resp_str,ret);
OSATaskSleep(1000);
ret = getMasterSimID();
catstudio_printf("%s: getMasterSimID ret %d\n",__FUNCTION__,ret);
if (isMasterSim0()){
ret = SendATCMDWaitResp(TEL_AT_CMD_ATP_10, at_str, 3, NULL,1,NULL, resp_str, sizeof(resp_str));
}else{
ret = SendATCMDWaitResp(TEL_AT_CMD_ATP_10+36, at_str, 3, NULL,1,NULL, resp_str, sizeof(resp_str));
}
catstudio_printf("%s: resp_str = %s, ret = %u\n",__FUNCTION__,resp_str,ret);
ret = CM_SetMasterSimID((CMSimID)CM_SIM_0, switch_sim_done);
//设置主卡副卡
if (ret != 0){
catstudio_printf("%s: CM_SetMasterSimID ret %d\n",__FUNCTION__,ret);
}