提交 3302ef9d 编写于 作者: Lawlieta's avatar Lawlieta

[net][at] Add at_client_recv function receive data timeout

上级 8f95b78d
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
extern "C" { extern "C" {
#endif #endif
#define AT_SW_VERSION "1.0.2" #define AT_SW_VERSION "1.1.0"
#define AT_SW_VERSION_NUM 0x10002 #define AT_SW_VERSION_NUM 0x10100
#define DBG_ENABLE #define DBG_ENABLE
#define DBG_SECTION_NAME "AT" #define DBG_SECTION_NAME "AT"
...@@ -231,7 +231,7 @@ int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout); ...@@ -231,7 +231,7 @@ int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout);
/* AT client send or receive data */ /* AT client send or receive data */
rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size); rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size);
rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size); rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_int32_t timeout);
/* set AT client a line end sign */ /* set AT client a line end sign */
void at_obj_set_end_sign(at_client_t client, char ch); void at_obj_set_end_sign(at_client_t client, char ch);
...@@ -263,7 +263,7 @@ int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const ...@@ -263,7 +263,7 @@ int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const
#define at_exec_cmd(resp, ...) at_obj_exec_cmd(at_client_get_first(), resp, __VA_ARGS__) #define at_exec_cmd(resp, ...) at_obj_exec_cmd(at_client_get_first(), resp, __VA_ARGS__)
#define at_client_wait_connect(timeout) at_client_obj_wait_connect(at_client_get_first(), timeout) #define at_client_wait_connect(timeout) at_client_obj_wait_connect(at_client_get_first(), timeout)
#define at_client_send(buf, size) at_client_obj_send(at_client_get_first(), buf, size) #define at_client_send(buf, size) at_client_obj_send(at_client_get_first(), buf, size)
#define at_client_recv(buf, size) at_client_obj_recv(at_client_get_first(), buf, size) #define at_client_recv(buf, size, timeout) at_client_obj_recv(at_client_get_first(), buf, size, timeout)
#define at_set_end_sign(ch) at_obj_set_end_sign(at_client_get_first(), ch) #define at_set_end_sign(ch) at_obj_set_end_sign(at_client_get_first(), ch)
#define at_set_urc_table(urc_table, table_sz) at_obj_set_urc_table(at_client_get_first(), urc_table, table_sz) #define at_set_urc_table(urc_table, table_sz) at_obj_set_urc_table(at_client_get_first(), urc_table, table_sz)
......
...@@ -425,17 +425,22 @@ rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size ...@@ -425,17 +425,22 @@ rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size
return rt_device_write(client->device, 0, buf, size); return rt_device_write(client->device, 0, buf, size);
} }
static char at_client_getchar(at_client_t client) static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeout)
{ {
char ch; rt_err_t result = RT_EOK;
while (rt_device_read(client->device, 0, &ch, 1) == 0) while (rt_device_read(client->device, 0, ch, 1) == 0)
{ {
rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL); rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL);
rt_sem_take(client->rx_notice, RT_WAITING_FOREVER);
result = rt_sem_take(client->rx_notice, rt_tick_from_millisecond(timeout));
if (result != RT_EOK)
{
return result;
}
} }
return ch; return RT_EOK;
} }
/** /**
...@@ -444,15 +449,17 @@ static char at_client_getchar(at_client_t client) ...@@ -444,15 +449,17 @@ static char at_client_getchar(at_client_t client)
* @param client current AT client object * @param client current AT client object
* @param buf receive data buffer * @param buf receive data buffer
* @param size receive fixed data size * @param size receive fixed data size
* @param timeout receive data timeout (ms)
* *
* @note this function can only be used in execution function of URC data * @note this function can only be used in execution function of URC data
* *
* @return >0: receive data size * @return >0: receive data size
* =0: receive failed * =0: receive failed
*/ */
rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size) rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_int32_t timeout)
{ {
rt_size_t read_idx = 0; rt_size_t read_idx = 0;
rt_err_t result = RT_EOK;
char ch; char ch;
RT_ASSERT(buf); RT_ASSERT(buf);
...@@ -467,7 +474,12 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size) ...@@ -467,7 +474,12 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size)
{ {
if (read_idx < size) if (read_idx < size)
{ {
ch = at_client_getchar(client); result = at_client_getchar(client, &ch, timeout);
if (result != RT_EOK)
{
LOG_E("AT Client receive failed, uart device get data error(%d)", result);
return 0;
}
buf[read_idx++] = ch; buf[read_idx++] = ch;
} }
...@@ -610,7 +622,7 @@ static int at_recv_readline(at_client_t client) ...@@ -610,7 +622,7 @@ static int at_recv_readline(at_client_t client)
while (1) while (1)
{ {
ch = at_client_getchar(client); at_client_getchar(client, &ch, RT_WAITING_FOREVER);
if (read_len < client->recv_bufsz) if (read_len < client->recv_bufsz)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册