Если же вы прямо в векторе приема по уарту будете проверять что приходит и парсить то грешно это.
сделал так: уарт складывает принимаемые данные в свой кольцевой буфер (Б1) Приложение, ответсвенное за модем, имеет собсвенный линейный буфер (Б2) и проверяет наличие данных в приемном буфере и забирает по одному. Как только поймали '\n' то обработка приема Б2 и указать что складывать данные в начале Б2.
по \n стоит парсер на флаги то есть:
if( memcmp( rx_buff, "OK\r\n", 4 ) == 0 ) { history_flag( mdm_tx_ok, set ); return; } if( memcmp( rx_buff, "ERROR\r\n", 6 ) == 0 ) { history_flag( mdm_tx_error, set ); return; } if( memcmp( rx_buff, "+CME ERROR:", 11 ) == 0 ) { history_flag( mdm_tx_error_cme, set ); return; } if( memcmp( rx_buff, "+CMS ERROR:", 11 ) == 0 ) { history_flag( mdm_tx_error_cms, set ); return; } if( memcmp( rx_buff, "#CGSN: ", 7 ) == 0 ) { history_flag( mdm_tx_cgsn_imei, set ); extract_add_func( mdm_tx_cgsn_imei ); return; } if( memcmp( rx_buff, "+CLIP:", 6 ) == 0 ) { history_flag( mdm_tx_clip, set ); extract_add_func( mdm_tx_clip ); return; } if( memcmp( rx_buff, "+CMTI:", 6 ) == 0 ) { history_flag( mdm_tx_cmti, set ); extract_add_func( mdm_tx_cmti ); return; }
флаги это биты в u32
и весь алгоритм тупо
if( retval == at_ok ) retval = at_send( SET_CMD_ECHO_MODE_EXEC_OFF, mdm_tx_ok, mdm_tx_error, 1000, 10, 1000 ); if( retval == at_ok ) retval = at_send( SET_FIXED_LOCAL_RATE_115200 ); if( retval == at_ok ) retval = at_send( SET_REPORT_MOBILE_ERROR ); if( retval == at_ok ) retval = at_send( SELECT_INTERFACE_STYLE );
всё что выше от что для симкома что для телита.
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|