请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432E401Y 工具与软件:
您好!
我正在尝试在 MSP432E401Y 上的一个项目中实施 Modbus。 我以 lwIP 中的 HTTPD 代码为例、创建了一个相当简单的处理程序和回调集。
如果我运行代码、系统将在接受连接后崩溃(我使用命令"telnet 502"(用于生成连接)。 我已经尝试单步执行代码、但如果它在调试器中单步执行、则不会发生硬故障。 特定的硬故障是故障地址为0x99200111的精确总线错误。 我是否有办法尝试找出导致此错误的代码?
我的虚拟服务器实现如下所示:
/**
* Data has been received on this pcb.
* For HTTP 1.0, this should normally only happen once (if the request fits in one packet).
*/
static err_t MOD_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err){
USB_Send_String("MODBUS: recv();");
if(p->next != NULL){
USB_Send_String("MODBUS: Multi-payload over capacity;");
return ERR_MEM;
}
struct MOD_Frame * frame = (struct MOD_Frame*) p->payload;
switch(frame->function){
case MOD_FUNC_READ_COILS:
USB_Send_String("MODBUS: Read Coils;");
break;
case MOD_FUNC_READ_DISCRETE:
USB_Send_String("MODBUS: Read Discrete;");
break;
case MOD_FUNC_READ_REGISTER:
USB_Send_String("MODBUS: Read Register;");
break;
}
return ERR_OK;
}
static void MOD_err(void *arg, err_t err){
USB_Send_String("MODBUS: err();");
}
/**
* Data has been sent and acknowledged by the remote host.
* This means that more data can be sent.
*/
static err_t MOD_sent(void *arg, struct tcp_pcb *pcb, u16_t len){
USB_Send_String("MODBUS: sent();");
return ERR_OK;
}
/**
* The poll function is called every 2nd second.
* If there has been no data sent (which resets the retries) in 8 seconds, close.
* If the last portion of a file has not been sent in 2 seconds, close.
*
* This could be increased, but we don't want to waste resources for bad connections.
*/
static err_t MOD_poll(void *arg, struct tcp_pcb *pcb){
USB_Send_String("MODBUS: poll()");
return ERR_OK;
}
err_t MODBUS_accept(void *arg, struct tcp_pcb *newpcb, err_t err){
if ((err != ERR_OK) || (newpcb == NULL)) {
USB_Send_String("MODBUS: Error in Accept;");
return ERR_VAL;
}
USB_Send_String("MODBUS: Accepted Client;");
tcp_setprio(newpcb, 1);
tcp_arg(newpcb, NULL);
/* Set up the various callback functions */
tcp_recv(newpcb, MOD_recv);
tcp_err(newpcb, MOD_err);
tcp_poll(newpcb, MOD_poll, 4);
tcp_sent(newpcb, MOD_sent);
delay_ms(100);
return ERR_OK;
}
void init_MODBUS(){
USB_Send_String("MODBUS: Init;");
//Initialize TCP server
struct tcp_pcb* conn = tcp_new_ip_type(IPADDR_TYPE_ANY);
if(conn == NULL){
USB_Send_String("MODBUS: tcp_new failed;");
return;
}
tcp_setprio(conn, 1); //Modbus has higher priority than HTTP...
int err = ERR_OK;
char errbuf[64];
tcp_arg(conn, (void*)0);
err = tcp_bind(conn, IP_ADDR_ANY, (502));
if(err != ERR_OK){
snprintf(errbuf,64,"MODBUS: TCP Bind Failure: %i;",err);
USB_Send_String(errbuf);
return;
}
conn = tcp_listen(conn);
tcp_accept(conn,MODBUS_accept);
USB_Send_String("MODBUS: Init Succesful;");
}
关于为何无法按预期工作、你们都有什么建议或想法吗? 感谢你能抽出时间。