hjc1421144715 2016-11-27 10:50 采纳率: 0%
浏览 1501
已结题

wifi智能小车通讯问题。

我的问题主要是以前师兄留下来的用来控制小车运动和接收小车上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();
图片说明
图片说明
图片说明

  • 写回答

1条回答 默认 最新

  • shen_wei 2016-11-28 03:54
    关注

    数据传说正常说明程序是对的,关键是看你实时数据数组的大小是否是固定的大小。。。根据固定大小来接受数据

    C#的数据 byte[] bt=new byte[m]; m是多大??看代码都是根据m的值来进行判断的。。

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站