用c# 写得程序 怎样连接硬件啊 连接 com口

时间:2022-08-31 00:06:50
单片机连接 计算机有个com口 我想让com口 连接c#      
 我用c# 写一个界面  想让单片机 返回一个值 呈现在c#写的界面里 怎么连接啊  好像用什么 串口 com口连接   我也不太明白   求高人指点 

12 个解决方案

#1


让单片机往COM口发数据,在计算机端写一个程序,读取COM口的数据啊。。。。你的思路不是有吗????
是计算机端的程序不会??

#2


SerialPort 控件

#3


对  计算机程序不回

#4


也知道一些private SerialPort serialPort = new SerialPort();
serialPort.PortName = com1;
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
但是  总是出错  高人指点一下   要详细  
谢谢

#5


楼上的heyuan390908582回答已经基本正确了,出错的问题,请具体说明一下出错的内容
估计缺了下面这个属性定义
serialPort.Encoding = Encoding.Default;//文本转换字节编码规则
或者这个属性的赋值错了
serialPort.PortName = "COM1";//必须是大写COM

#6


serialPort.open();打开
serialPort.Write(,,);发送
serialPort.Read(,,);读数

#7


先学基础,基础弄懂了。再来弄。

#8


我已经收到数了   但是和我要的数不一样啊 我想要我c#界面串口返回来的数  随着单片机返回数变化  单片机不断的变化着数   但界面数据好像和单片机返回的数据不一样啊   请求指点

#9


用serialPort控件可以进行串口通  然后再上下位机进行通信就可以了

#10


不太明白   能给详细的代码么

#11


我说详细点   求指导  
  我从单片机那里 一次接受两个数  两个数的范围 都是 0~255中变化  单片机 不断的改变数 我想用一个c#的界面的控件textbox 表示出来   我现在已经得到数了  但是 有时候 是想要的  有时候 不是想要的
这是我编的程序   有错误 刚学是新手   求指导 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO.Ports;
using System.Threading;
using System.Windows.Threading;

namespace 泥石流1
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        DispatcherTimer dt1 = new DispatcherTimer();
        public Window1()
        {
            InitializeComponent();
            dt1.IsEnabled = false;
            dt1.Interval = TimeSpan.FromMilliseconds(0.417);
            dt1.Tick += new EventHandler(dt1_Tick);

        }

        void dt1_Tick(object sender, EventArgs e)
        {
            SerialPort sp = new SerialPort();
            sp.PortName = "COM3";
            sp.BaudRate = 9600;
            sp.Encoding = Encoding.Default;
            sp.Parity = Parity.None;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.Open();
            AReceiveData(sp);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            dt1.IsEnabled = true;
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            dt1.IsEnabled = false;
        }


        //private void ReceiveData(SerialPort sp)
        //{
        //    //同步阻塞接收数据线程
        //    Thread threadReceive = new Thread(new ParameterizedThreadStart(AReceiveData));
        //    threadReceive.Start(sp);
        //}

        private void AReceiveData(object spobj)
        {
            SerialPort sp = (SerialPort)spobj;
            System.Threading.Thread.Sleep(0);
            sp.ReadTimeout = 1000;
            try
            {
                byte firstByte = Convert.ToByte(sp.ReadByte());
                int bytesRead = sp.BytesToRead;
                byte[] bytesData = new byte[bytesRead + 1];
                bytesData[0] = firstByte;
                for (int i = 1; i <= bytesRead; i++)
                    bytesData[i] = Convert.ToByte(sp.ReadByte());

                textBox1.Text = System.Text.Encoding.Default.GetString(bytesData);

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

#12


补充一下   
接收的两个数中有空格
不用上面的也行 
能出来就好
谢谢了

#1


让单片机往COM口发数据,在计算机端写一个程序,读取COM口的数据啊。。。。你的思路不是有吗????
是计算机端的程序不会??

#2


SerialPort 控件

#3


对  计算机程序不回

#4


也知道一些private SerialPort serialPort = new SerialPort();
serialPort.PortName = com1;
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
但是  总是出错  高人指点一下   要详细  
谢谢

#5


楼上的heyuan390908582回答已经基本正确了,出错的问题,请具体说明一下出错的内容
估计缺了下面这个属性定义
serialPort.Encoding = Encoding.Default;//文本转换字节编码规则
或者这个属性的赋值错了
serialPort.PortName = "COM1";//必须是大写COM

#6


serialPort.open();打开
serialPort.Write(,,);发送
serialPort.Read(,,);读数

#7


先学基础,基础弄懂了。再来弄。

#8


我已经收到数了   但是和我要的数不一样啊 我想要我c#界面串口返回来的数  随着单片机返回数变化  单片机不断的变化着数   但界面数据好像和单片机返回的数据不一样啊   请求指点

#9


用serialPort控件可以进行串口通  然后再上下位机进行通信就可以了

#10


不太明白   能给详细的代码么

#11


我说详细点   求指导  
  我从单片机那里 一次接受两个数  两个数的范围 都是 0~255中变化  单片机 不断的改变数 我想用一个c#的界面的控件textbox 表示出来   我现在已经得到数了  但是 有时候 是想要的  有时候 不是想要的
这是我编的程序   有错误 刚学是新手   求指导 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO.Ports;
using System.Threading;
using System.Windows.Threading;

namespace 泥石流1
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        DispatcherTimer dt1 = new DispatcherTimer();
        public Window1()
        {
            InitializeComponent();
            dt1.IsEnabled = false;
            dt1.Interval = TimeSpan.FromMilliseconds(0.417);
            dt1.Tick += new EventHandler(dt1_Tick);

        }

        void dt1_Tick(object sender, EventArgs e)
        {
            SerialPort sp = new SerialPort();
            sp.PortName = "COM3";
            sp.BaudRate = 9600;
            sp.Encoding = Encoding.Default;
            sp.Parity = Parity.None;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.Open();
            AReceiveData(sp);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            dt1.IsEnabled = true;
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            dt1.IsEnabled = false;
        }


        //private void ReceiveData(SerialPort sp)
        //{
        //    //同步阻塞接收数据线程
        //    Thread threadReceive = new Thread(new ParameterizedThreadStart(AReceiveData));
        //    threadReceive.Start(sp);
        //}

        private void AReceiveData(object spobj)
        {
            SerialPort sp = (SerialPort)spobj;
            System.Threading.Thread.Sleep(0);
            sp.ReadTimeout = 1000;
            try
            {
                byte firstByte = Convert.ToByte(sp.ReadByte());
                int bytesRead = sp.BytesToRead;
                byte[] bytesData = new byte[bytesRead + 1];
                bytesData[0] = firstByte;
                for (int i = 1; i <= bytesRead; i++)
                    bytesData[i] = Convert.ToByte(sp.ReadByte());

                textBox1.Text = System.Text.Encoding.Default.GetString(bytesData);

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

#12


补充一下   
接收的两个数中有空格
不用上面的也行 
能出来就好
谢谢了