我的问题主要是以前师兄留下来的用来控制小车运动和接收小车上stm32板子发过来的车轮速度数据的c#程序没有问题,可以正常控制运动和接收数据,但老师现在要我用c++写一段代码,同样用来接收stm32发的小车速度数据,这是一个WiFi小车。我自己是在网上找的一个基于tcp的c++socket的客户端程序。测试结果是如果我用stm32板子发送一个01到08的值(如图1所示),那么我的这个c++程序调试结果显示是可以接收到这样的数据的。但如果发送的是小车实时的速度数据时(如图1注释所示),接收的结果就出现问题了 (如图2、3所示),但以前的c#程序却是可以正确接收到数据的。我用串口助手显示小车的实时速度时,它显示的数据也是正确的,所以我觉得小车发送数据这块应该是没问题的,而应该是我的c++接收程序有问题。小弟菜鸟一枚,希望对这块比较了解的大神多多指点小弟,万分感谢。
下面是程序。
c#接收数据程序
private void Listen() //监听端口,同步监听,新线程内执行while循环
{
//try
{
int i=0,k=0,wendu=0;
float leftbackwheel, leftfrontwheel, rightbackwheel, rightfrontwheel;
UInt16 sudu1,sudu2, sudu3, sudu4;
// int number;
//double temp;//我修改
string zifu1="";
string zifu2="";
string zifu3="";
string zifu4= "";
string zifu5= "";
string zifu6 = "";
byte[] bt=new byte[m];
//S1 s1 = new S1();
//S1 s2 = new S1();//我修改
byte[] buffer = new byte[1000];
byte[] old = new byte[2000];
int length ;
while (true)
{
if (c.Available != 0)//接收到的数据不等于0
{ length = c.Receive(buffer);//接收数据,并将数据存入缓冲区
if (length < 600)
{
for (k = 0; k < length; k = k + m)
while (k <= (length - m) && length >= m)
{
for (i = 0; i < m; i++)
{
bt[i] = buffer[k + i];
}
if (bt[0] == 0xA5 && bt[m - 1] == 0x5A)
{
sudu3 = (UInt16)(bt[2] * 256 + bt[1]);//我修改 将有符号变为无符号,左后轮速度
sudu4 = (UInt16)(bt[4] * 256 + bt[3]);//左前轮速度
sudu1 = (UInt16)(bt[6] * 256 + bt[5]);//右前轮速度
sudu2 = (UInt16)(bt[8] * 256 + bt[7]);//右后轮速度
leftbackwheel = (float)sudu3 / 100;
leftfrontwheel = (float)sudu4 / 100;
rightfrontwheel = (float)sudu1 / 100;
rightbackwheel = (float)sudu2 / 100;
//temp = (float)(bt[9] * 256 + bt[10]) / 10.0;
zifu1 = leftfrontwheel.ToString();
zifu2 = rightfrontwheel.ToString();
zifu3 = rightbackwheel.ToString();
zifu4 = leftfrontwheel.ToString();
zifu5 = leftbackwheel.ToString();
zifu6 = leftfrontwheel.ToString();
y1.Add(rightfrontwheel);
y2.Add(rightbackwheel);
y3.Add(leftbackwheel);
y4.Add(leftfrontwheel);
y1.RemoveAt(0);
y2.RemoveAt(0);
y3.RemoveAt(0);
y4.RemoveAt(0);
zGraph1.f_Refresh();
zGraph2.f_Refresh();
wendu++;
if (wendu == 5)
{
textBox8.Text = zifu4;
textBox1.Text = zifu2;
wendu = 0;
}
message = zifu1 + " " + zifu2 + " " + zifu3 + " " + zifu4 + " " + zifu5 + " " + zifu6 + "\r\n";
StreamWriter sw = new StreamWriter(@"C:\bb.txt", true, System.Text.Encoding.Default);
sw.Write(message);
sw.Close();
k = k + m;
// Thread.Sleep(10);
}
else
k++;
}
}
}
Thread.Sleep(20);
}
我的c++接收数据程序
#include <stdafx.h>
#include
#include
#include
#include
#include
using namespace std;
//#define DELAY 2500000
#pragma comment (lib, "WS2_32.lib")
//void delay();
void main()
{
WORD wVersionRequested;
WSADATA wsaData;//加载套接字库,创建套接字
int err;
wVersionRequested = MAKEWORD( 1,1);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return ;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return ;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//TCP 构建通讯socket,流式socket
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.102");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(2001);
//connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//向服务器发送连接请求
if (0 != connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
std::cout << "连接服务器失败\n";
}
char recvBuf[100];
/*char bt[10];*/
/*float leftfrontwheel, leftbackwheel;
float rightfrontwheel, rightbackwheel;
unsigned short sudu1,sudu2;
unsigned short sudu3,sudu4;*/
int length;
int m=10;
/*int m =10,i =0,k =0;*/
while (1)
{
length=recv(sockClient,recvBuf,100,0);
printf("%d\n",length);
int i;
for(i=0; i<100; i++)
{
printf("%x\n",recvBuf[i]);
}
//if (recvBuf[0] == 0xffffffa5 && recvBuf[m-1] == 0x5a)
//{
// sudu3 = (unsigned short)(recvBuf[2] * 256 + recvBuf[1]);//左后轮速度
// sudu4 = (unsigned short)(recvBuf[4] * 256 +recvBuf[3]);//左前轮速度
// sudu1 = (unsigned short)(recvBuf[6] * 256 +recvBuf[5]);//右前轮速度
// sudu2 = (unsigned short)(recvBuf[8] * 256 + recvBuf[7]);//右后轮速度
// leftbackwheel = (float)sudu3/100 ;
// leftfrontwheel = (float)sudu4/256 ;
// rightfrontwheel = (float)sudu1/256 ;
// rightbackwheel = (float)sudu2/100 ;
// printf("%f\n",rightfrontwheel);
/*}*/
}
closesocket(sockClient);//关闭套接字,关闭加载套接字库
WSACleanup();