工具/软件:TI-RTOS
您好!
我正在使用 CC3200-LaunchXL 和导入的 MQTT_CLIENT 示例作为参考。
我想从 UART 读取数据、并在有 UART 中断时在 MQTT 上发送相同的数据
此外、只要有一个按钮中断、我就会向 MQTT 发送一条消息、并且由于这个部件已经被执行、工作正常。
我对 UART 中断的代码进行了相应的更改、
但是、当存在 UART 中断时、I 会对 Msg 进行排队、以便创建事件、并且 OS 会执行 MQTT 消息发送、如 for (;;)循环中所述、
但是、每当我接收到 UART 中断时、代码都会进入加载程序退出、我尝试增大"OSI.h"文件中的栈大小、并增加"OSI_tirtos.c"文件中的队列大小、但我仍然面临相同的问题
下面、我添加了代码段或所做的更改、以添加消息、当存在 UART 中断时将排队、以便操作系统可以执行 MQTT 发送功能
//******** 声明********
typedef struct connection_config{
SlMqttClientCtxCfg_t broker _config;
void * clt_ctx;
unsigned char * client_id;
unsigned char * usr_name;
unsigned char * usr_pwd;
bool 是_clean;
unsigned int keep_alive_time;
slMqttClientCbs_t 回调;
int num_topics;
char *主题[topic_count];
unsigned char QoS[topic_count];
SlMqttWhill_t wo_params;
bool 是已连接的;
}connect_config;
typedef 枚举
{
PUSH_button_SW2_pressed、
PUSH_button_SW3_pressed、
Brocher_DISCONNECT、
UART_RX_MQTT_SEND
{events;typedef
struct
{
void * hndl;
events event;}event_msg;
//******* UART 的初始化*********
void Initialize_UART()
{
//配置 UART
InitTerm();
//寄存器用于接收数据的 UART 中断处理程序
MAP_UARTIntRegister (器件、UARTIntHandler);
//启用 UART 接收中断
MAP_UARTIntEnable (器件、UART_INT_RX);
//禁用 UART FIFO
UARTFIFODisable (device);
}
//****** UART 中断处理程序*********
空 UARTIntHandler()
{
EVENT_msg msg;
unsigned long ulStatus;
ulStatus = MAP_UARTIntStatus (器件、1);
MSG.EVENT = UART_RX_MQTT_SEND;
MSG.hndl =空;
UARTIntClear (器件、ulStatus);
while (UARTCharsAvail (设备))
{
//
//从终端获取输入。
//
cCharacter = UARTCharGet (器件);
if (cCharacter='#')
{
boolStart=true;
}
IF (boolStart)
{
Cstring[iStringLength ]= cCharacter;
iStringLength ++;
}
if (cCharacter='&')
{
boolStart=false;
boolSendMqt=true;
}
}
//编写指示发布消息的消息
OSI_MsgQWrite (&g_PBQueue、&msg、OSI_NO_WAIT);
UARTIntClear (器件、ulStatus);
}
//******** 主函数********
void main()
{
long lRetVal =-1;
//
//初始化电路板配置
//
BoardInit();
//
//用于 UART 的 Pinmux
//
PinMuxConfig();
//
//配置 UART
//
InitTerm();
Initialize_UART();
//
//启动 SimpleLink 主机
////
********* MQTT_CLIENT 任务主体********
for (;;)
{
OSI_MsgQRead (&g_PBQueue、&RecvQue、OSI_WAIT_FOREVE);
if (push_button_SW2_pressed = RecvQue.event)
{
button_if_EnableInterrupt (SW2);
//
//发送发布消息
//
sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
pub_topic_sw3、data_sw2、strlen ((char*) data_sw2)、qOS2、retain);
}
否则、如果(push_button_SW3_pressed = RecvQue.event)
{
boolButtonPressed =!boolButtonPressed;
if (boolButtonPressed)
ButtonTimerConfigNStart();
其他
ButtonTimerDeinitStop();
button_if_EnableInterrupt (SW3);
if (boolSmartConfig)
{
转至 FORCE_SMART CONFIG;
}
// //
// //发送发布消息
// //
// sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
// pub_topic_sw3、data_sw3、strlen ((char*) data_sw3)、qOS2、retain);
}
否则、if (broker_sDISCONNINNINNING_= RecvQue.event)
{
GPIO_IF_LedOn (MCU_RED_LED_GPIO);
if (!is_ip_acquired (g_ulStatus))
{
local_con_conf->is 已连接= true;
sl_ExtLib_MqttClientDisconnect (((void*) local_con_conf[iCount].clt_ctx);
//assert_ON_ERROR (lRetVal);
sl_WlanDisconnect ();
}
lRetVal=CheckInternetConnection();
while (lRetVal < 0)//while ((lRetVal < 0)&&(g_ucRetryConnectionTimeout > retry_connection_timeout_CNT))
{
G_ucConnectTimeout1 = 0;
GPIO_IF_LedOn (MCU_RED_LED_GPIO);
OSI_SLEEP (58000);
GPIO_IF_LedOff (MCU_RED_LED_GPIO);
OSI_SLEEP (2000);
if (!is_connected (g_ulStatus))(如果!is_connected (g_ulStatus)
{
正在重新连接_AP();
}
lRetVal = CheckInternetConnection();
G_ucRetryConnectionTimeout++;
}
}
否则、如果(UART_RX_MQTT_SEND = RecvQue.event)
{
//
//发送发布消息
//
sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
pub_topic_sw3、data_sw3、strlen ((char*) data_sw3)、qOS2、retain);
}
}
//*********
请尽快帮助我解决此问题
谢谢、此致、
Utkarash