CommonStatus Inf_QS100_SendData(uint8_t *data, uint16_t len)
{
CommonStatus st;
uint8_t count = TCP_RETRY_COUNT;
// 物联网卡连上网:附着,没有连上网:去附着--------------------------
// 判断是否连接到外网
do
{
st = Inf_QS100_Get_IP();
} while (st == COMMON_ERROR && count--);
// 重试次数耗尽
if (count == 0)
{
debug_printfln("连接外网失败!");
return COMMON_ERROR;
}
// 初始化Socket 创建客户端-----------------------------------------------
count = TCP_RETRY_COUNT;
uint8_t socket_id = 0xff; // 不要写成0,否则不知道是否成功socket_id的取值只有0和1
do
{
st = Inf_QS100_CreateClient(CLIENT_PORT, &socket_id);
} while (st == COMMON_ERROR && count--);
// 重试次数耗尽
if (count == 0)
{
debug_printfln("创建客户端失败!");
return COMMON_ERROR;
}
// 连接远程服务端-------------------------------------------------------------
// 为防止网络不通畅导致连接失败,这里就建立重复连接机制
do
{
st = Inf_QS100_ConnectServer(socket_id, TCP_SERVER_IP, TCP_SERVER_PORT);
} while (st == COMMON_ERROR && count--);
// 重试次数耗尽
if (count == 0)
{
debug_printfln("连接远程服务端失败!");
return COMMON_ERROR;
}
// 发送数据到远程服务端----------------------------------------------------------
do
{
st == Inf_QS100_SendDataToServer(socket_id, data, len, SEQUENCE);
} while (st == COMMON_ERROR && count--);
// 重试次数耗尽
if (count == 0)
{
debug_printfln("发送数据到远程服务端失败!");
return COMMON_ERROR;
}
// 关闭客户端------------------------------------------------------------------
do
{
st == Inf_QS100_CloseClient(socket_id);
} while (st == COMMON_ERROR && count--);
// 重试次数耗尽
if (count == 0)
{
debug_printfln("关闭客户端失败!");
return COMMON_ERROR;
}
return COMMON_OK;
}
注意:在QS100上创建客户端时,就生成了socket_id,用于和云端服务器做交互
在写代码中可能遇到的bug:
(1)发送数据过长,发送命令缓冲区Cmd接收不下
uint8_t data_hex[len * 2 + 1]; // 在这里直接赋值会报错
memset(data_hex, 0, sizeof(data_hex));
for (uint16_t i = 0; i < len; i++)
{
sprintf((char *)&data_hex[i * 2], "%02x", data[i]);
}
//因为要发送大量数据所以要设置的大一点
uint8_t cmd[1024] = {0};
// 拼接命令
sprintf((char *)cmd, "AT+NSOSD=%d,%d,%s,0x200,%d\r\n", socket_id, len, data_hex, sequence);
(2)栈空间过小,在运行中导致栈溢出-------》在启动的汇编文件中将栈区空间调大
(3) 超时时间过短
// 发送AT指令 一秒钟SQ100能接收1200字节,超时时间,要尽量大一点否则或导致数据发送不完整
HAL_UART_Transmit(&huart3, cmd, strlen((char *)cmd), HAL_MAX_DELAY);
(4)cmd生命周期可能比串口发送的时间短(串口是异步的),导致串口还没有把数据还没发送完,数据就没了(8001---输入的AT命令参数不合法)------------------------》将cmd的生命周期+static