小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 7062|回复: 5

请教各位大神有关C#编写上位机程序的问题。

[复制链接]
发表于 2015-8-15 00:54:49 | 显示全部楼层 |阅读模式
    最近自学了些C#知识,打算编写一个温度采集的上位机软件。单片机通过socket把温湿度值发送给上位机。命令格式是{FF 01 温度 湿度}。上位机socket采用的是TCP方式同步接收。每间隔10s给单片机发送请求,然后单片机将温湿度回传给上位机。现在socket已经连接上了。但是数据回传方面有一些问题。就是上位机接收到的命令一般只有第一位是正确的,后面的位全部是0,例如温度是1,湿度是1。但是为上位机显示收到的数据确是  FF 00 00 00 ;我通过串口助手查看回传数据确又是正确的: FF 01 01 01 。找了半天不知道问题出在哪? 再此寻求各位大神帮助,看看哪些地方错误会产生这样的问题。
回复

使用道具 举报

发表于 2015-8-15 10:50:12 | 显示全部楼层
贴出代码看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-15 12:47:06 | 显示全部楼层

老大,我试着把温湿度数组精简了  也不行~   麻烦您帮我看看,问题究竟是出在哪了。太感谢您了!
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;



namespace Serial
{
    public partial class mainFrom : Form
    {
        bool isOpen = false;            //socket打开标志位  
        bool isSetProperty = false;     //socket设置标志位
        bool SolenoidvalveTemp = false;


        IPAddress ips;
        IPEndPoint ipe;
        Socket socket = null;        //声明一个Socket类

        byte[] CMD_request = { 0xff, 0xaa, 0xaa, 0xaa, 0xff };
        byte[] CMD_Solenoidvalve1_On = { 0xff, 0x00, 0x01, 0x01, 0xff };            //一路电磁阀打开
        byte[] CMD_Solenoidvalve1_Off = { 0xff, 0x00, 0x01, 0x00, 0xff };           //一路电磁阀关闭
        byte[] CMD_Recive = { };


        public mainFrom()
        {
            InitializeComponent();
        }

        private void mainFrom_Load(object sender, EventArgs e)
        {
            tbxIPAdress.Text = "192.168.1.100";
            tbxPort.Text = "2001";
        }
        void ReciveData()
        {
            try
            {
                 byte[] data = new byte[15];
                 Socket d = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);   //创建一个Socket
                 d.Connect(ipe);                                                                           //连接到服务器
                 d.Receive(data, data.Length, SocketFlags.None);
                 d.Close();
;
                 if (15 == data.Length)       //改为{01 温度 湿度 02 温度 湿度 03 温度 湿度 04 温度 湿度 05 温度 湿度 }
                {
                    lblTemp1.Text = data[1].ToString();
                    lblHumidity1.Text = data[2].ToString();

                    lblTemp2.Text = data[4].ToString();
                    lblHumidity2.Text = data[5].ToString();

                    lblTemp3.Text = data[7].ToString();
                    lblHumidity3.Text = data[8].ToString();

                    lblTemp4.Text = data[10].ToString();
                    lblHumidity4.Text = data[11].ToString();

                    lblTemp5.Text = data[13].ToString();
                    lblHumidity5.Text = data[14].ToString();

                 }
                 

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }


        void SendData(byte[] data)
        {            
            try
            {

                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket

                c.Connect(ipe);//连接到服务器

                byte[] bs = data;
                c.Send(bs, bs.Length, 0);//发送测试信息
                c.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
       {
           if (isOpen == false)
           {
               if (!CheckSocketSetting())
               {
                   MessageBox.Show("通讯地址未设置!", "错误提示");
                   return;
               }
               if (!isSetProperty)       //通讯为设置
               {
                   SetSocket();
                   isSetProperty = true;
               }
             try   //打开socket
             {
                 byte[] recive = new byte[1024];
                 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket

                 isOpen = true;
                 btnStart.Text = "通讯中";
                 

                 //socket打开后则相关的串口设置按钮便不可以再用

                 tbxIPAdress.Enabled = false;
                 tbxPort.Enabled = false;


              }
                catch (Exception f)
                {
                    //socket打开失败后,相应标志位取消
                    socket.Close();
                    btnStart.Text = "开始通讯";
                    tbxIPAdress.Enabled = true;
                    tbxPort.Enabled = true;
                    isSetProperty = false;
                    isOpen = false;
                    MessageBox.Show(f.Message);
                }
            }
               else
               {
                   try    //打开串口状态下
                   {
                       socket.Close();
                       isOpen = false;
                       isSetProperty = false;
                       btnStart.Text = "开始通讯";

                       //关闭串口后,串口设置选项便可以继续使用
                       tbxIPAdress.Enabled = true;
                       tbxPort.Enabled = true;
                   }
                   catch (Exception g)
                   {
                       MessageBox.Show(g.Message);
                   }
               }
           }
      
        private void SetSocket()
        {
            ips = IPAddress.Parse(tbxIPAdress.Text);
            ipe = new IPEndPoint(ips, Convert.ToInt32(tbxPort.Text));//把ip和端口转化为IPEndPoint实例
        }

        private void btnPoint1_Click(object sender, EventArgs e)
        {
            byte[] tempPoint = { 0xff, 0x01, 0x01, 0x00, 0xff };
            if (tbxPoint1.Text == "")
            {
                MessageBox.Show("请设置湿度控制点", "错误提示");
                return;
            }
            else
            {
                tempPoint[3] = byte.Parse(tbxPoint1.Text);
                SendData(tempPoint);
            }
        }

        private void btnOnOff01_Click(object sender, EventArgs e)
        {
            
           //一路电磁阀关闭
            if (!SolenoidvalveTemp)
            {
                SendData(CMD_Solenoidvalve1_On);
                SolenoidvalveTemp = true;
                btnOnOff01.Text = "关";
            }
            else
            {
                SendData(CMD_Solenoidvalve1_Off);
                SolenoidvalveTemp = false;
                btnOnOff01.Text = "开";
            }
        }

        private bool CheckSocketSetting()  //检查socket是否设置   
        {
            if (tbxIPAdress.Text.Trim() == "") return false;
            if (tbxPort.Text.Trim() == "") return false;
            return true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if(isOpen == true)
            {
                SendData(CMD_request);
                ReciveData();
            }
        }
    }
}
回复 支持 反对

使用道具 举报

发表于 2015-8-15 13:37:14 | 显示全部楼层
Jack.C 发表于 2015-8-15 12:47
老大,我试着把温湿度数组精简了  也不行~   麻烦您帮我看看,问题究竟是出在哪了。太感谢您了!
代码如 ...

你这个代码问题很多啊,在定时器里面执行接收函数本身就是不对的,每一个计数周期都启动了一个新的socket,很快就达到连接上限。
我们编写代码都是慎用定时器这个控件,能不用就不用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-15 14:55:11 | 显示全部楼层
liuviking 发表于 2015-8-15 13:37
你这个代码问题很多啊,在定时器里面执行接收函数本身就是不对的,每一个计数周期都启动了一个新的socket ...

好的 谢谢老大,我看看换一种逻辑试试!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-15 15:02:08 | 显示全部楼层
liuviking 发表于 2015-8-15 13:37
你这个代码问题很多啊,在定时器里面执行接收函数本身就是不对的,每一个计数周期都启动了一个新的socket ...

老大  同步通讯能实现我要的这个功能吧?我们论坛的上位机是异步通讯?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-5 00:33 , Processed in 1.077703 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表