STM32F407移植contiki2.6后使用LWIP库实现tcp client

最近在做智能家居,物联网项目,用到了C下的contiki移植

经过一阵调试,终于在 STM32F407移植contiki2.6后使用LWIP库实现tcp client.

一路艰辛谁人知道....唯有留下代码以资青春

#include "main.h"
#include "contiki.h"
#include "sys\autostart.h"
void led_init();
#define SYSTEMTICK_PERIOD_MS  10
#define AUTOSTART_ENABLE 1
unsigned int idle_count = 0;

__IO uint32_t LocalTime = 0; /* this variable is used to create a time reference incremented by 10ms */
uint32_t timingdelay;
float f_adc_value[ADC_CHANNLE_NUM];
unsigned char str[200];

//添加
const static uint8_t TCP_TestData[]=
{
 "LwIP TCP Client on sm32f407 to server connected!"  //
};
void TCP_Client_Inits();
err_t  TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err);

PROCESS(blink_process, "Blink");
AUTOSTART_PROCESSES(&blink_process);
PROCESS_THREAD(blink_process, ev, data)
{

  PROCESS_BEGIN();
  while(1)
  {
    static struct etimer et;
    etimer_set(&et, CLOCK_SECOND);
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

    //打开LED
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    printf("LED ON\r\n");
    etimer_set(&et, CLOCK_SECOND);
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

    //关闭LED
    GPIO_SetBits(GPIOA,GPIO_Pin_4);
    printf("LED OFF\r\n");

  }
   PROCESS_END();
}

int main(void)
{
    struct tcp_pcb *pcb;
    unsigned int i = 0;

    ETH_BSP_Config();
    LwIP_Init();
    TCP_Client_Init(TCP_LOCAL_PORT,TCP_SERVER_PORT,TCP_SERVER_IP); //tcp客户端初始化
    ADC_Configuration();
    RS232_DMA_Init();
    USART_232_Configuration();

    // dbg_setup_uart();
  led_init();
  printf("Initialising\r\n");
    clock_init();
  process_init();
  process_start(&etimer_process, NULL);
  autostart_start(autostart_processes);
  //process_start(&blink_process,NULL);
  printf("Processes running\r\n");

    while (1)
    {

        TCP_Client_Inits();
    //SysCtlDelay(50000);
        Delay_s(0x7FFFFFF);                                            //必要的延时    0xfffff
    }
}

/******* 这是一个回调函数,当TCP客户端请求的连接建立时被调用********/
err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
   tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData)-1,0);      //发送数据

   tcp_close(pcb);

   return ERR_OK;
}

/*********************************************************************************************************
** Function name:           TCP_Client_Init
** Descriptions:            TCP客户端的初始化,当需要建立客户端连接时调用
** input parameters:        无
** output parameters:       无
** Returned value:          0
*********************************************************************************************************/
void TCP_Client_Inits()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;

  IP4_ADDR(&ipaddr,111,22,102,100);

  Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb) 

  tcp_bind(Clipcb,IP_ADDR_ANY,1010);       // 绑定本地IP地址和端口号 

  tcp_connect(Clipcb,&ipaddr,1011,TcpCli_Connected);
    tcp_recv(Clipcb,TCP_Client_Recvs);
}

/***********************************************************************
函数名称:TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
功    能:tcp客户端接收数据回调函数
输入参数:
输出参数:
编写时间:2013.4.25
编 写 人:
注    意:这是一个回调函数,当TCP服务器发来数据时调用
***********************************************************************/

err_t  TCP_Client_Recvs(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{

    char *c;
    struct pbuf *q;
    if (p != NULL)//如果有数据来了
        {
            tcp_recved(pcb, p->tot_len);
            for(q=p; q != NULL; q = q->next)
            {
                c = q->payload;
                printf("received from server msg :%s\r\n",c);
                tcp_write(pcb, c, p->len, 0);//接着就直接将收到的数据直接发送出去。
                //tcp_output(pcb);
            }
            pbuf_free(p);
        }
    err = ERR_OK;
    return err;
}
/**
  * @brief  Inserts a delay time.
  * @param  nCount: number of 10ms periods to wait for.
  * @retval None
  */
void Delay(uint32_t nCount)
{
  /* Capture the current local time */
  timingdelay = LocalTime + nCount;  

  /* wait until the desired delay finish */
  while(timingdelay > LocalTime)
  {
  }
}

void led_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
    /* Enable the GPIO_LED Clock */
    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);                          

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/**
  * @brief  Updates the system local time
  * @param  None
  * @retval None
  */
void Time_Update(void)
{
  LocalTime += SYSTEMTICK_PERIOD_MS;
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {}
}

#endif
时间: 2024-11-05 02:33:17

STM32F407移植contiki2.6后使用LWIP库实现tcp client的相关文章

cpe移植到framework后,原有数据库存放问题的解决。

最近公司业务需要,把原以apk形式存在的CPE,打入framework层,即剥离出cpe,搞了好半天,终于有时间写博客,做个笔记把遇到的问题说下. 首先遇到的问题是原apk中的一些东西,移植到framework层后,环境不同,必须做一些修改. 例如, 1.ContentProvider,因没有提供给其他程序数据共享,要么去掉,全部改为sqlite直接调用.要么把这个ContentProvider剥离出来,形成一个apk,固定到framework,给cpe提供ContentProvider. 2.

主库添加数据文件后,备库因为创建文件失败而停止数据同步

primary环境:11gR2 RAC+ASMstandby环境:本地单机 主库添加数据文件后,备库因为创建文件失败而停止数据同步. 1.查看主库环境的数据文件 SQL> select file#,status,name from v$datafile; FILE# STATUS NAME ---------- ------- -------------------------------------------- 1 SYSTEM +ABCE/test/datafile/system.293.

Modbus库开发笔记之四:Modbus TCP Client开发

这一次我们封装Modbus TCP Client应用.同样的我们也不是做具体的应用,而是实现TCP客户端的基本功能.我们将TCP客户端的功能封装为函数,以便在开发具体应用时调用. 对于TCP客户端我们主要实现的功能有两个:其一是生成访问TCP服务器的命令,总共支持8中功能码.其二是对TCP服务器端返回的信息进行解析并根据结果进行各种操作,同样也是支持8中功能吗的操作.具体软件访问结构如下: 1.访问命令的生成 客户端作为主动交互端,需要向服务器发各种操作请求命令.所以对于TCP客户端来说,首先要

cocos2d-x移植安卓时解决引用sqlite3库问题

1.先说说cocos2d-x 3.x移植安卓简单步骤 (1)进入你工程的proj.android目录,打开jni目录里的Android.mk(别忘了先备份一个) 如果你工程文件少的话就android.mk里老老实实地把所有cpp文件都包含,  如: LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/Audio.cpp \ ../../Classes/Chinese.cpp \

升级_开阔视野之Oracle图形化升级(升级后dbca建库)—10.2.0.1.0升为10.2.0.5.0

***********************************************声明**********************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net/huangyanlong/article/det

cocos2dx项目移植android平台使用第三方so库被删掉的问题

cocos2dx项目android平台在编译的时候会把libs/armeabi目录清空,这就是为什么我们编译的时候导入的第三方so库会被删掉的原因. 解决方案: 1. 在jni目录下新建prebuilt目录,并把要使用的第三方so库复制到该目录: 2.修改jni/Android.mk文件如下: ok!搞定!

如何获取媒体库中所有音频文件信息,并在文件增删后及时更新媒体库

在4.4版本之前,我们可以使用发送广播的方式,强制刷新多媒体库 IntentFilter intentFilter = new IntentFilter( Intent.ACTION_MEDIA_SCANNER_STARTED); intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); intentFilter.addDataScheme("file"); sendBroadcast(new Intent(Intent

[转帖] cocos2dx项目移植android平台使用第三方so库被删掉的问题

原文地址: http://www.2cto.com/kf/201408/329559.html cocos2dx项目android平台在编译的时候会把libs/armeabi目录清空,这就是为什么我们编译的时候导入的第三方so库会被删掉的原因. 解决方案: 1. 在jni目录下新建prebuilt目录,并把要使用的第三方so库复制到该目录: 2.修改jni/Android.mk文件如下: ok!搞定!

【Android开发经验】如何获取媒体库中所有音频文件信息,并在文件增删后及时更新媒体库(转)

转载请注明出处: http://blog.csdn.net/zhaokaiqiang1992 今天一打开博客,发现一位朋友给我发了一封私信,请教下面的问题,所以特写此文章,为其解惑. 从这位朋友的提问中,我们需要了解下面的这些问题,才能给他很好的解答: (1)如何获取手机里所有歌曲的信息? (2)在歌曲文件发生改变,比如增删操作之后,如何及时的更新媒体库,从而获取到最新的歌曲信息? (3)在4.4版本之后,扫描sd卡,更新媒体库的操作发生变化了吗? 下面,我将就以上三个问题,进行解答. (1)如