找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1833|回复: 2
打印 上一主题 下一主题
收起左侧

关于modbus协议的问题

[复制链接]
跳转到指定楼层
楼主
怎样在以太网模块中实现modbus协议?
#include "uip.h"
#include "uipopt.h"
#include "uip_arp.h"
#include "enc28j60.h"
#include <stdio.h>
#include <string.h>
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
/* NULL */
#ifndef NULL
#define NULL (void *)0
#endif
#define MHz_22_1184
#define AUTO_RECONNECT 1
#define delay_us(x)  delay(x)
#define delay_ms(x)  delay(x*1000)
#define delay_sec(x) delay(x*1000*1000)
#define SERVER_PORT 5480
u16_t ipaddr[2];
/*12MHz crystal about 1u=1us*/
void delay(u32_t u)
{
#ifdef MHz_22_1184
u *= 2;
#endif
while(u--);
}
/*uIP call back func*/
void uip_appcall(void)
{
switch(uip_conn->rport) {
  case HTONS(SERVER_PORT):
   if(uip_timedout()||uip_aborted()||uip_closed()){
#if AUTO_RECONNECT
    /*reconnect to server*/
    delay_sec(5);
    uip_connect(ipaddr, HTONS(SERVER_PORT));
#endif
   }else if(uip_connected()){
#if 1
    /*is connected ok*/
    uip_send(uip_appdata,sprintf((char*)uip_appdata,"%s",
    "Hello,I connected to you! thanks."));
#endif
   }else if(uip_rexmit()){
#if 1
    /*need retransmission last packet*/
    uip_send(uip_appdata,sprintf((char*)uip_appdata,"%s",
    "this is retransmission packet"));
#endif
   }else if(uip_poll()){
    /*poll connecte is idle*/
#if 1
//    uip_send(uip_appdata,sprintf((char*)uip_appdata,"%s",
//    "Hi, we are idle"));
    uip_send("idle",4);
#endif
   }else if(uip_acked()){
    /*get a ack for send packet ok*/
#if 0
    uip_send(uip_appdata,sprintf((char*)uip_appdata,"%s",
    "this is a second packet."));
#endif
    if(uip_newdata()){
     goto newdata_with_acked;
    }
   }else if(uip_newdata()){
newdata_with_acked:
#if 1
    /*receving a new data*/
    uip_appdata[uip_len+0] = ((char*)&uip_len)[0];
    uip_appdata[uip_len+1] = ((char*)&uip_len)[1];
    uip_send(uip_appdata,uip_len+2);
#endif
   }else{
    /*error*/
   }
   break;
  default:
   /*discard packet*/
   break;
}
}
/*-----------------------------------------------------------------------------------*/
int main(void)
{
idata u8_t i, arptimer;
/* Initialize the network device driver. */
dev_init();
/* Initialize the ARP */
uip_arp_init();
/* Initialize the uIP TCP/IP stack. */
uip_init();
/*set host MAC addr*/
uip_ethaddr.addr[0] = 0x12;
uip_ethaddr.addr[1] = 0x34;
uip_ethaddr.addr[2] = 0x56;
uip_ethaddr.addr[3] = 0x78;
uip_ethaddr.addr[4] = 0x90;
uip_ethaddr.addr[5] = 0xAB;
#if UIP_FIXEDADDR == 0
/*host ip addr*/
uip_ipaddr(ipaddr, 192,168,1,13);
uip_sethostaddr(ipaddr);
/*netmask addr*/
uip_ipaddr(ipaddr, 255,255,255,0);
uip_setnetmask(ipaddr);
/*router ip addr*/
uip_ipaddr(ipaddr, 192,168,1,1);
uip_setdraddr(ipaddr);
#endif
/*connect to server*/
uip_ipaddr(ipaddr, 192,168,1,10);
uip_connect(ipaddr, HTONS(SERVER_PORT));
arptimer = 0;
while(1) {
  /* Let the tapdev network device driver read an entire IP packet
     into the uip_buf. If it must wait for more than 0.5 seconds, it
     will return with the return value 0. If so, we know that it is
     time to call upon the uip_periodic(). Otherwise, the tapdev has
     received an IP packet that is to be processed by uIP. */
  uip_len = dev_poll();
     if(uip_len == 0) {
   for(i = 0; i < UIP_CONNS; i++) {
    uip_periodic(i);
    /* If the above function invocation resulted in data that
    should be sent out on the network, the global variable
    uip_len is set to a value > 0. */
    if(uip_len > 0) {
     uip_arp_out();
     dev_send();
    }
   }
   /* Call the ARP timer function every 10 seconds. */
   if(++arptimer == 20) {
    uip_arp_timer();
    arptimer = 0;
   }
   delay_us(5000);
     } else {
   if(BUF->type == htons(UIP_ETHTYPE_IP)) {
    uip_arp_ipin();
    uip_input();
    /* If the above function invocation resulted in data that
    should be sent out on the network, the global variable
    uip_len is set to a value > 0. */
    if(uip_len > 0) {
     uip_arp_out();
     dev_send();
    }
   } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
    uip_arp_arpin();
    /* If the above function invocation resulted in data that
    should be sent out on the network, the global variable
    uip_len is set to a value > 0. */
    if(uip_len > 0) {
     dev_send();
    }
   }
  }
}
return 0;
}

0_1320213072Bxb2_gif.jpg (107.52 KB, 下载次数: 37)

关于程序

关于程序

0_1320213051036W_gif.jpg (195.54 KB, 下载次数: 33)

0_1320213051036W_gif.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332297 发表于 2018-5-17 17:12 | 只看该作者
在 UDP 或者 TCP 数据 发送 段  加入  协议数据  即可, 同时   CRC16 校验 可以 去掉 ,  TCP/IP  有自己的 校验 可以去掉
回复

使用道具 举报

板凳
ID:325252 发表于 2018-5-18 13:10 | 只看该作者
kerty80 发表于 2018-5-17 17:12
在 UDP 或者 TCP 数据 发送 段  加入  协议数据  即可, 同时   CRC16 校验 可以 去掉 ,  TCP/IP  有自己 ...

感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表