问题描述
- stm32与上位机通过网口通信,网口读不出数据?
-
使用w5500evb与上位机通信,w5500evb是一个网络芯片,它的MCU是stm32f103系列的,要实现将传感器采集到的数据值通过网口显示在上位机的网络调试助手上,现在我可以通过串口将数据显示在串口调试助手上(说明传感器工作正常),但是通过网口传数据时,在上位机的网络调试助手不显示,请教大神,这是什么原因呢?(网络通信是正常的,我用上位机的网络调试助手给下位机发送数据123,下位机收到之后会自动将123发送给上位机,而且在网络调试助手上也显示了这个数据,说明网络通信是正常的)
解决方案
你的测试,也只能说从服务器下发数据到终端是正常的,但反方向是否正确,这要看你的:
(1) 发送的代码
(2) 网络可能还是有问题,尝试 PING 一下公网的 IP,看看 PING 能否正常执行
解决方案二:
现附上主函数源代码,请各位大神拯救一下吧
#include "mcu_init.h"
#include "config.h"
#include "device.h"
#include "spi2.h"
#include "socket.h"
#include "w5500.h"
#include "at24c16.h"
#include "util.h"
#include "myiic.h"
#include
extern uint8 txsize[];
extern uint8 rxsize[];
uint8 buffer1[1024];/*定义一个1KB的缓存*/
uint8 buffer2[1024];/*定义一个1KB的缓存*/
//温度结果 16bit
uint16 TempValue;
//湿度结果 16bit
uint16 HumValue;
//温度转换结果
float TempResult;
//湿度转换结果
float HumResult;
//校验值
uint8 CheckValue;// = 0x00;
//错误
uint8 error;// = 0x00;
//float pTempValue;
//float pHumValue;
uint8 read_temperature_and_humidity()
{
Delay_ms(10000);
ConReset();
//获得温度和湿度数据,16位格式
error += Measure(&TempValue,&CheckValue,TEMP);
error += Measure(&HumValue,&CheckValue,HUMI);
//温度湿度计算,浮点数形式
Cal(TempValue ,HumValue,&TempResult,&HumResult);
// pTempValue=TempResult;
// pHumValue=HumResult;
//通过串口输出,温度和湿度数据
printf("温度 %2.1fC 湿度 %2.1f%%n",TempResult,HumResult);
return 0;
}
void main()
{
uint16 port=30000;/*定义一个端口并初始化*/
// uint16 len=0;
uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定义Mac变量*/
uint8 lip[4]={192,168,10,111};/*定义lp变量*/
uint8 sub[4]={255,255,255,0};/*定义subnet变量*/
uint8 gw[4]={192,168,10,1};/*定义gateway变量*/
uint8 ip[4];
RCC_Configuration(); /* 配置单片机系统时钟*/
RCC_Config();
GPIO_Configuration();/* 配置GPIO*/
NVIC_Configuration();/* 配置嵌套中断向量*/
Systick_Init(72);/* 初始化Systick工作时钟*/
USART1_Init(); /*初始化串口通信:115200@8-n-1*/
at24c16_init();/*初始化eeprom*/
printf("W5500 EVB initialization over.rn");
Reset_W5500();/*硬重启W5500*/
WIZ_SPI_Init();/*初始化SPI接口*/
SHT10_Config();
printf("W5500 initialized!rn");
setSHAR(mac);/*配置Mac地址*/
setSUBR(sub);/*配置子网掩码*/
setGAR(gw);/*配置默认网关*/
setSIPR(lip);/*配置Ip地址*/
//Init. TX & RX Memory size of w5500
sysinit(txsize, rxsize); /*初始化8个socket*/
setRTR(2000);/*设置溢出时间值*/
setRCR(3);/*设置最大重新发送次数*/
getSIPR (ip);
printf("IP : %d.%d.%d.%drn", ip[0],ip[1],ip[2],ip[3]);
getSUBR(ip);
printf("SN : %d.%d.%d.%drn", ip[0],ip[1],ip[2],ip[3]);
getGAR(ip);
printf("GW : %d.%d.%d.%drn", ip[0],ip[1],ip[2],ip[3]);
printf("Network is ready.rn");
//read_temperature_and_humidity();
while(1)
{
switch(getSn_SR(0))/*获取socket0的状态*/
{
case SOCK_INIT:/*socket初始化完成*/
listen(0);/*在TCP模式下监听*/
break;
case SOCK_ESTABLISHED:/*socket连接建立*/
if(getSn_IR(0) & Sn_IR_CON)
{
setSn_IR(0, Sn_IR_CON);/*Sn_IR的第0位置1*/
}
// len=getSn_RX_RSR(0);/*len为已接收数据的大小*/
if(read_temperature_and_humidity()==0)
{
// recv(0,buffer1,len);/*W5500接收来自Sever的数据*/
//read_temperature_and_humidity();
buffer2[0]=TempResult;
buffer2[1]=HumResult;
send(0,buffer2,sizeof(buffer2));/*W5500向Server发送数据*/
printf("温度 %2.1fC 湿度 %2.1f%%n",TempResult,HumResult);
}
Delay_ms(5000);
break;
case SOCK_CLOSE_WAIT:/*socket等待关闭状态*/
break;
case SOCK_CLOSED:/*socket关闭*/
socket(0,Sn_MR_TCP,port,Sn_MR_ND);/*打开socket0的一个端口*/
break;
}
}
}