[STM32] 网口读出数据不显示?

[复制链接]
2987|11
 楼主| 小董lg121 发表于 2015-1-7 10:28 | 显示全部楼层 |阅读模式
下位机的MCU为stm32f103系列的,将传感器采集到的数据值通过网口显示在上位机的网络调试助手上,现在我可以通过串口将数据显示在串口调试助手上,但是通过网口传数据时,在上位机的网络调试助手不显示,请教大神,这是什么原因呢?(网络通信是正常的,我用上位机的网络调试助手给下位机发送数据123,下位机收到之后会自动将123发送给上位机,而且在网络调试助手上也显示了这个数据,说明网络通信是正常的)
ayb_ice 发表于 2015-1-7 10:46 | 显示全部楼层
是不是格式不对
ningling_21 发表于 2015-1-7 12:02 | 显示全部楼层
使用UDP还是TCP协议? 数据包格式或连接有没问题?
 楼主| 小董lg121 发表于 2015-1-7 12:10 | 显示全部楼层
ayb_ice 发表于 2015-1-7 10:46
是不是格式不对

send语句发送的是一个整型数组,我将一个float数据赋给这个整型数组,最多也就是小数点后面的数据不显示吧,但不应该所有数据都不显示啊,我的分析可能不对,现附上主函数代码,请教大神指点
  1. #include "mcu_init.h"
  2. #include "config.h"
  3. #include "device.h"
  4. #include "spi2.h"
  5. #include "socket.h"
  6. #include "w5500.h"
  7. #include "at24c16.h"
  8. #include "util.h"
  9. #include "myiic.h"

  10. #include <stdio.h>

  11. extern uint8 txsize[];
  12. extern uint8 rxsize[];

  13. uint8 buffer1[1024];/*定义一个1KB的缓存*/
  14. uint8 buffer2[1024];/*定义一个1KB的缓存*/

  15.      //温度结果  16bit
  16.     uint16 TempValue;
  17.     //湿度结果 16bit
  18.     uint16 HumValue;
  19.     //温度转换结果
  20.     float TempResult;
  21.     //湿度转换结果
  22.     float HumResult;
  23.     //校验值
  24.     uint8 CheckValue;// = 0x00;
  25.     //错误
  26.     uint8 error;// = 0x00;
  27.    
  28.     //float pTempValue;
  29.     //float pHumValue;
  30.    

  31. uint8 read_temperature_and_humidity()
  32.   {
  33.     Delay_ms(10000);
  34.     ConReset();
  35.                 //获得温度和湿度数据,16位格式
  36.     error += Measure(&TempValue,&CheckValue,TEMP);
  37.     error += Measure(&HumValue,&CheckValue,HUMI);
  38.                 //温度湿度计算,浮点数形式
  39.     Cal(TempValue ,HumValue,&TempResult,&HumResult);
  40.    // pTempValue=TempResult;
  41.    // pHumValue=HumResult;
  42.                 //通过串口输出,温度和湿度数据
  43.            printf("温度 %2.1fC 湿度 %2.1f%%\n",TempResult,HumResult);
  44.     return 0;
  45.                                                                
  46.   }


  47. void main()
  48. {
  49.   uint16 port=30000;/*定义一个端口并初始化*/
  50. // uint16 len=0;
  51.    
  52.   uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定义Mac变量*/
  53.   uint8 lip[4]={192,168,10,111};/*定义lp变量*/
  54.   uint8 sub[4]={255,255,255,0};/*定义subnet变量*/
  55.   uint8 gw[4]={192,168,10,1};/*定义gateway变量*/
  56.   uint8 ip[4];
  57.   
  58.   RCC_Configuration(); /* 配置单片机系统时钟*/
  59.   RCC_Config();
  60.   GPIO_Configuration();/* 配置GPIO*/
  61.   NVIC_Configuration();/* 配置嵌套中断向量*/
  62.   
  63.   Systick_Init(72);/* 初始化Systick工作时钟*/
  64.   USART1_Init(); /*初始化串口通信:115200@8-n-1*/
  65.   at24c16_init();/*初始化eeprom*/
  66.   printf("W5500 EVB initialization over.\r\n");
  67.   
  68.   Reset_W5500();/*硬重启W5500*/
  69.   WIZ_SPI_Init();/*初始化SPI接口*/
  70.   
  71.   SHT10_Config();
  72.   printf("W5500 initialized!\r\n");  

  73.   setSHAR(mac);/*配置Mac地址*/
  74.   setSUBR(sub);/*配置子网掩码*/
  75.   setGAR(gw);/*配置默认网关*/
  76.   setSIPR(lip);/*配置Ip地址*/
  77.   
  78.     //Init. TX & RX Memory size of w5500
  79.   sysinit(txsize, rxsize); /*初始化8个socket*/
  80.   
  81.   setRTR(2000);/*设置溢出时间值*/
  82.   setRCR(3);/*设置最大重新发送次数*/
  83.   

  84.   getSIPR (ip);
  85.   printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  86.   getSUBR(ip);
  87.   printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  88.   getGAR(ip);
  89.   printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  90.   printf("Network is ready.\r\n");
  91.   //read_temperature_and_humidity();
  92.   
  93.   while(1)
  94.   {
  95.      switch(getSn_SR(0))/*获取socket0的状态*/
  96.      {
  97.         case SOCK_INIT:/*socket初始化完成*/
  98.            listen(0);/*在TCP模式下监听*/
  99.    
  100.            break;
  101.          case SOCK_ESTABLISHED:/*socket连接建立*/
  102.           if(getSn_IR(0) & Sn_IR_CON)
  103.           {
  104.               setSn_IR(0, Sn_IR_CON);/*Sn_IR的第0位置1*/
  105.            }
  106.           // len=getSn_RX_RSR(0);/*len为已接收数据的大小*/
  107.            if(read_temperature_and_humidity()==0)
  108.            {
  109.                           
  110.              // recv(0,buffer1,len);/*W5500接收来自Sever的数据*/
  111.               //read_temperature_and_humidity();
  112.               buffer2[0]=TempResult;
  113.               buffer2[1]=HumResult;
  114.               send(0,buffer2,sizeof(buffer2));/*W5500向Server发送数据*/
  115.               printf("温度 %2.1fC 湿度 %2.1f%%\n",TempResult,HumResult);

  116.            }
  117.           Delay_ms(5000);
  118.            break;
  119.          case SOCK_CLOSE_WAIT:/*socket等待关闭状态*/
  120.            break;
  121.          case SOCK_CLOSED:/*socket关闭*/
  122.            socket(0,Sn_MR_TCP,port,Sn_MR_ND);/*打开socket0的一个端口*/
  123.            break;
  124.      }
  125.   }
  126. }
 楼主| 小董lg121 发表于 2015-1-7 12:15 | 显示全部楼层
ningling_21 发表于 2015-1-7 12:02
使用UDP还是TCP协议? 数据包格式或连接有没问题?

使用TCP协议,这个板子是stm32+w5500的板子,w5500这个网络模块里已经封装好TCP协议了,所以我自己认为数据包格式没问题,连接没有问题,上位机和下位机是可以ping通的,可能我考虑的不周全,没有发现问题在哪,现附上源码,请大神有时间帮忙看一下,非常感谢!
  1. #include "mcu_init.h"
  2. #include "config.h"
  3. #include "device.h"
  4. #include "spi2.h"
  5. #include "socket.h"
  6. #include "w5500.h"
  7. #include "at24c16.h"
  8. #include "util.h"
  9. #include "myiic.h"

  10. #include <stdio.h>

  11. extern uint8 txsize[];
  12. extern uint8 rxsize[];

  13. uint8 buffer1[1024];/*定义一个1KB的缓存*/
  14. uint8 buffer2[1024];/*定义一个1KB的缓存*/

  15.      //温度结果  16bit
  16.     uint16 TempValue;
  17.     //湿度结果 16bit
  18.     uint16 HumValue;
  19.     //温度转换结果
  20.     float TempResult;
  21.     //湿度转换结果
  22.     float HumResult;
  23.     //校验值
  24.     uint8 CheckValue;// = 0x00;
  25.     //错误
  26.     uint8 error;// = 0x00;
  27.    
  28.     //float pTempValue;
  29.     //float pHumValue;
  30.    

  31. uint8 read_temperature_and_humidity()
  32.   {
  33.     Delay_ms(10000);
  34.     ConReset();
  35.                 //获得温度和湿度数据,16位格式
  36.     error += Measure(&TempValue,&CheckValue,TEMP);
  37.     error += Measure(&HumValue,&CheckValue,HUMI);
  38.                 //温度湿度计算,浮点数形式
  39.     Cal(TempValue ,HumValue,&TempResult,&HumResult);
  40.    // pTempValue=TempResult;
  41.    // pHumValue=HumResult;
  42.                 //通过串口输出,温度和湿度数据
  43.            printf("温度 %2.1fC 湿度 %2.1f%%\n",TempResult,HumResult);
  44.     return 0;
  45.                                                                
  46.   }


  47. void main()
  48. {
  49.   uint16 port=30000;/*定义一个端口并初始化*/
  50. // uint16 len=0;
  51.    
  52.   uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定义Mac变量*/
  53.   uint8 lip[4]={192,168,10,111};/*定义lp变量*/
  54.   uint8 sub[4]={255,255,255,0};/*定义subnet变量*/
  55.   uint8 gw[4]={192,168,10,1};/*定义gateway变量*/
  56.   uint8 ip[4];
  57.   
  58.   RCC_Configuration(); /* 配置单片机系统时钟*/
  59.   RCC_Config();
  60.   GPIO_Configuration();/* 配置GPIO*/
  61.   NVIC_Configuration();/* 配置嵌套中断向量*/
  62.   
  63.   Systick_Init(72);/* 初始化Systick工作时钟*/
  64.   USART1_Init(); /*初始化串口通信:115200@8-n-1*/
  65.   at24c16_init();/*初始化eeprom*/
  66.   printf("W5500 EVB initialization over.\r\n");
  67.   
  68.   Reset_W5500();/*硬重启W5500*/
  69.   WIZ_SPI_Init();/*初始化SPI接口*/
  70.   
  71.   SHT10_Config();
  72.   printf("W5500 initialized!\r\n");  

  73.   setSHAR(mac);/*配置Mac地址*/
  74.   setSUBR(sub);/*配置子网掩码*/
  75.   setGAR(gw);/*配置默认网关*/
  76.   setSIPR(lip);/*配置Ip地址*/
  77.   
  78.     //Init. TX & RX Memory size of w5500
  79.   sysinit(txsize, rxsize); /*初始化8个socket*/
  80.   
  81.   setRTR(2000);/*设置溢出时间值*/
  82.   setRCR(3);/*设置最大重新发送次数*/
  83.   

  84.   getSIPR (ip);
  85.   printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  86.   getSUBR(ip);
  87.   printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  88.   getGAR(ip);
  89.   printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  90.   printf("Network is ready.\r\n");
  91.   //read_temperature_and_humidity();
  92.   
  93.   while(1)
  94.   {
  95.      switch(getSn_SR(0))/*获取socket0的状态*/
  96.      {
  97.         case SOCK_INIT:/*socket初始化完成*/
  98.            listen(0);/*在TCP模式下监听*/
  99.    
  100.            break;
  101.          case SOCK_ESTABLISHED:/*socket连接建立*/
  102.           if(getSn_IR(0) & Sn_IR_CON)
  103.           {
  104.               setSn_IR(0, Sn_IR_CON);/*Sn_IR的第0位置1*/
  105.            }
  106.           // len=getSn_RX_RSR(0);/*len为已接收数据的大小*/
  107.            if(read_temperature_and_humidity()==0)
  108.            {
  109.                           
  110.              // recv(0,buffer1,len);/*W5500接收来自Sever的数据*/
  111.               //read_temperature_and_humidity();
  112.               buffer2[0]=TempResult;
  113.               buffer2[1]=HumResult;
  114.               send(0,buffer2,sizeof(buffer2));/*W5500向Server发送数据*/
  115.               printf("温度 %2.1fC 湿度 %2.1f%%\n",TempResult,HumResult);

  116.            }
  117.           Delay_ms(5000);
  118.            break;
  119.          case SOCK_CLOSE_WAIT:/*socket等待关闭状态*/
  120.            break;
  121.          case SOCK_CLOSED:/*socket关闭*/
  122.            socket(0,Sn_MR_TCP,port,Sn_MR_ND);/*打开socket0的一个端口*/
  123.            break;
  124.      }
  125.   }
  126. }
ayb_ice 发表于 2015-1-7 13:44 | 显示全部楼层
这看不出来什么问题

有些串口助手只显示ASCII码的,
有些可选显示原始数据,用这种方式查看
lphaff 发表于 2015-1-7 14:50 | 显示全部楼层
我也遇到过这种问题
你发个123你要单步调试看下是否确实收到123
在win7里面如果配置不对,
或者是网络调试助手的问题
有时候你的下位机并没有正常工作,也可以返回123的
 楼主| 小董lg121 发表于 2015-1-7 21:50 | 显示全部楼层
ayb_ice 发表于 2015-1-7 13:44
这看不出来什么问题

有些串口助手只显示ASCII码的,

原来是数据转换的时候出问题了,现在好了,多谢大神赐教!
 楼主| 小董lg121 发表于 2015-1-7 21:51 | 显示全部楼层
lphaff 发表于 2015-1-7 14:50
我也遇到过这种问题
你发个123你要单步调试看下是否确实收到123
在win7里面如果配置不对,

数据转换的时候出问题了,现在解决了,非常感谢您的耐心解答,谢谢啦~
lphaff 发表于 2015-1-7 22:41 | 显示全部楼层
W5500还是比较好用的。不知道楼主有没有遇到长时间工作会连接不上的情况?
通宵敲代码 发表于 2015-1-8 00:15 | 显示全部楼层
小董lg121 发表于 2015-1-7 21:51
数据转换的时候出问题了,现在解决了,非常感谢您的耐心解答,谢谢啦~

有时间最好说一下具体的原因,
说说解决的思路跟办法,给大家分享一下!
 楼主| 小董lg121 发表于 2015-1-8 20:58 | 显示全部楼层
通宵敲代码 发表于 2015-1-8 00:15
有时间最好说一下具体的原因,
说说解决的思路跟办法,给大家分享一下! ...

恩恩,好的。后来改了改,数据转换不是最主要的问题,具体问题主要出在if判断语句上,if判断语句最好不要用函数做判断,这样语法上没有错,逻辑上也没错,但下到单片机里之后很可能出问题,可能显示的是乱码,(为什么显示乱码我也不知道),所以最后if判断语句尽可能是个表达式,这样单片机运行的时候不会再进到另一个函数里,出问题的可能也就不大了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部