2 vix1314 VIX1314 于 2017.01.04 11:58 提问

关于C#串口接收单片机返回的反馈码

图中的串口测试工具可以接收到一条反馈码,我自己写的winform却接收不到,哪位大神了解串口工具的源码或者知道我的代码怎么改嘛,哪位大神指点一下,万分感谢!
int n = sc._serialPort.BytesToRead;
StringBuilder builder=new StringBuilder();
byte[] rec = new byte[n]; //新建一个接受数组
sc._serialPort.Read(rec, 0, n); //将串口接收到的数据写入接收数组
//sc.DataReceived(object sender, EventArgs e, rec);
builder.Append(Encoding.ASCII.GetString(rec));
这个是我自己写的,获取不到东西,还有一个是别人提供的写好的
public SerialPort _serialPort = null;
//定义委托
public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);
//定义接收数据事件
public event SerialPortDataReceiveEventArgs DataReceived;

            void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (DataReceived != null)
        {
            byte[] _data = new byte[_serialPort.BytesToRead];
            _serialPort.Read(_data, 0, _data.Length);
            DataReceived(sender, e, _data);
            //a += _data.Length;
            //rec += System.Text.Encoding.Default.GetString(_data)+_data.Length;
        }
    }
            可是这两种都接收不到东西,请大神指教一下我应该怎么改写这两个函数或者是怎样写

2个回答

Tiger_Zhao
Tiger_Zhao   Rxr 2017.01.04 13:42

串口属于独占模式,同一时刻只能被一个程序打开。
你运行程序前关闭了测试工具没?

rzzssss
rzzssss   2017.01.20 10:16

void _serialPort_DataReceived
这个是个事件,在串口有数据来的时候会触发,而你却在事件中把他当方法递归。代码不报错就已经很不错了。
重写接收事件 DataReceived。这个只管接收,或者接收到的赋值字符串/字符数组,里面不要做任何判断,声明byte数组、调用read接收....
private static void aSerialPor_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int iByteLen = aSerialPor.BytesToRead;

        byte[] iBytes;
        if (IsGroup)
        {
            int iGroup = iByteLen / OneGroupSum;
            for (int i = 0; i < iGroup; i++)
            {
                iBytes = new byte[OneGroupSum];
                aSerialPor.Read(iBytes, 0, OneGroupSum);
                JsByteSum += OneGroupSum;
                ByteList.Enqueue(iBytes);
            }
        }
        else
        {
            iBytes = new byte[iByteLen];
            aSerialPor.Read(iBytes, 0, iByteLen);
            JsByteSum += iByteLen;
            ByteList.Enqueue(iBytes);
        }
    }
            别处考来的,大概这个样子
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#中使用seriport和单片机进行串口长数据收发不全,解决办法
最近做了一个项目,上位机向单片机要205个字节的报文。每次上位机接收的数据总是分成好几段,不能一次接收205个字节。所以对数据处理造成影响。因此就想着怎么能实现一次接收205字节数据,一次进行处理。试了很多办法,最后终于解决了。 C#中,使用的是serialPort.DataReceived来接收数据。一开始,上位机向单片机发送轮询指令后,单片机按照modbus协议上传205个字节数据。但是每次
51单片机串口接收字符串
实际有两个程序 一个是接收以某一特定字符开头的字符串 并不接收此特定字符 这个字符只起个标志的作用。 另一个是单纯接收字符串。 所接受的字符串存在一个数组中,程序简洁命了。 所用单片机:STC89C52
C#串口通信-向串口发送数据,同步接收返回数据
最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不支持多线程调用)。     一、Machine类     1、Machine类有一个静态变量,定义如下: pr
51单片机串口接收一个数组
/****************************************************************************************** 串口中断函数 ReData[]: 里是一个字节类型的数组,这里一次只接收8个字节数据. *************************************************************
51单片机串口程序,字符串/16进制发送与接收
这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。 字符串发送与十六进制发送,参考:http://blog.csdn.net/wityy/article/details/8234739 程序皆由PC串口工具发送,由单片机接收,并返回接收值给PC机。
51单片机接收数组
   最近在做一个项目,其中有一模块是需要通过串口使单片机与电脑进行通信,在单片机中我是用C语言进行编程,在应用程序中是用.net编程。其中有一个要求是电脑一次发送十个数据,单片机里定义一个数组,接收这10个数据。可是在进行检验的过程中却发现接收的数据会移位,比如我从电脑中发送的数据是a,b,c,d,e,f,i,j,k,l.那么理论上我在单片机中定义的数组array[10]应该也是array[10]={a,b,c,d,e,f,i,j,k,l.可实际上却不是这样子的,正真接收的数据是array[10]={l,
串口收到的数据转换成ascii
将串口收到的数据进行ascii码转换
串口通讯中接收和发送float类型数据
使用共用体来解决数据的编解码问题,共用体可以使不同的数据类型来共享相同的地址空间。#include <stdio.h> #include <string.h>int main(void) { union result { float d; unsigned char data[4]; }r1,r2; // 特别需要注意的是在单片机中in
STM32单片机串口的深思--主要是接收中断函数的编写
其实学单片机使用的时候,往往大家都觉得简单,很快就过了,但其实有一些东西是值得深思的,我以前在写程序的时候往往都是发送数据,那么调用重写的printf()函数就可以了,但这次的项目中用到了NRF双全工通讯,这就需要串口的收发,这回就发生了写问题,具体的流水账就不说了。简单说就是串口收可比发将就多了。 void USART1_IRQHandler(void) //串
扫描枪读条码数据在单片机串口电路的读取与显示
最近做的一个单片机串口通信电路,将制作过程中遇到的问题,及解决办法记录下来...