串口通讯,检测,c#写的问题。

yijianxiangde100 2008-10-13 03:17:25
//当前使用的串口
SerialPort sp = new SerialPort();
if (sp.IsOpen) //先判断串口是否打开
condition1 = true;
if (condition1 == true)//如果打开的话,在判断缓冲区中是否有数据
{
//接收缓冲区中数据的字节数。
//接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象自身的内部缓冲。
int rlen = sp.BytesToRead;
if (rlen > 0)
{
condition2 = true;
}
else condition2 = false;
}
if (isServiceRun)
condition3 = true;
if (condition1 && condition2 )
this.label10.Text = "COM通讯是否正常:是";

//但是问题就出在那个属性中,BytesToRead,我在给他不停的传数据,但是rlen 还是为零?这就是问题所在,求助?谢谢。
...全文
391 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yijianxiangde100 2008-10-15
  • 打赏
  • 举报
回复
谢谢了,有这么多的朋友关心我的贴子,我最后实现了,发现在用串口通讯的时候,它的数据传输不是实时的,在一段时间内会没有数据的传输,所以,通讯的端口应该是个一段时间才有空闲,有一段时间是可以没有数据的。
wanghao2979 2008-10-15
  • 打赏
  • 举报
回复
接点分
chenglidexiaoxue 2008-10-15
  • 打赏
  • 举报
回复
用串口监听程序看看是否收到了数据
wangyanboq 2008-10-15
  • 打赏
  • 举报
回复
为什么不用DateRecevied事件呢?
Red_angelX 2008-10-14
  • 打赏
  • 举报
回复
小公司就喜欢拿版权来糊弄新员工
yijianxiangde100 2008-10-14
  • 打赏
  • 举报
回复
谢谢了,不好意思这是公司的项目,涉及版权的问题,恐怕不行吧,还是算了。
这个问题简单的来说,就是
虽然你给串口一直在传数据,但是有时能够读取到一部分,但是有时候就没有。我不知道这是什么原因?
CraxyMouse 2008-10-14
  • 打赏
  • 举报
回复
多发一些代码呢!?
yijianxiangde100 2008-10-14
  • 打赏
  • 举报
回复
谢谢这位朋友,但是这段程序是一段代码?初始化端口的在别的代码中,
我在强调一下我的问题:
串口一切正常,而且我一直在不停的给其模拟的发数据,但是它有时没有数据。就是红色的那一部分没有rlen会变为0,但是偶然会有数据。
//当前使用的串口
SerialPort sp = new SerialPort();
if (sp.IsOpen) //先判断串口是否打开
condition1 = true;
if (condition1 == true)//如果打开的话,在判断缓冲区中是否有数据
{
//接收缓冲区中数据的字节数。
//接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象自身的内部缓冲。
int rlen = sp.BytesToRead;
if (rlen > 0)
{
condition2 = true;
}
else condition2 = false;
}
if (isServiceRun)
condition3 = true;
if (condition1 && condition2 )
yijianxiangde100 2008-10-14
  • 打赏
  • 举报
回复
谢谢这位朋友,但是这段程序是一段代码?初始化端口的在别的代码中,
我在强调一下我的问题:
串口一切正常,而且我一直在不停的给其模拟的发数据,但是它有时没有数据。就是红色的那一部分没有rlen会变为0,但是偶然会有数据。
//当前使用的串口
SerialPort sp = new SerialPort();
if (sp.IsOpen) //先判断串口是否打开
condition1 = true;
if (condition1 == true)//如果打开的话,在判断缓冲区中是否有数据
{
//接收缓冲区中数据的字节数。
//接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象自身的内部缓冲。
[color=#FF0000int] int rlen = sp.BytesToRead;[/color]
if (rlen > 0)
{
condition2 = true;
}
else condition2 = false;
}
if (isServiceRun)
condition3 = true;
if (condition1 && condition2 )
this.label10.Text = "COM通讯是否正常:是";
supawei 2008-10-13
  • 打赏
  • 举报
回复
最近许多朋友,问道串口的问题。对于串口,可能有许多朋友存在误区。
串口类读取信息,大多数情况下应该是异步调用(不是必须)。这样可以省去许多麻烦。
方法是注册事件DataReceived,在其回调时,读取数据。
另外要注意SerialPort的配置,通讯双方如果配置不统一,通讯是无法正常进行的。
CraxyMouse 2008-10-13
  • 打赏
  • 举报
回复
/******************************************************************
* Copyright(c) : Tangxu
* Description :
* CreateDate : 2006-9-01 04:53:08
* Creater : Tang.xu
* LastChangeDate:
* LastChanger :
* Version Info : 1.0.0
* ******************************************************************/
using System;
using System.IO.Ports;
using System.Threading;
using System.Text;

namespace Tangxu.Common
{
public class ReadCom
{
public ReadCom()
{
_ReadConfig = new ReadConfigure(System.Environment.CurrentDirectory + "\\Com_Info.xml");
}

public ReadCom(string sCom,int nBaud):this()
{

}

private byte[] _ReadBuffer;
private SerialPort ss_port = new SerialPort();
private static int nReadCount = 0;
private ReadConfigure _ReadConfig;

#region Initialize com port

public bool InitCom()//初始化建串口类实例
{
// return true;
try
{
ss_port.PortName = _ReadConfig.GetNodeValue("PORT");// _sComPort;
ss_port.BaudRate = int.Parse(_ReadConfig.GetNodeValue("BAUD"));//_nBaud;
ss_port.ReadBufferSize = 10240;
ss_port.DataBits = int.Parse(_ReadConfig.GetNodeValue("DATA"));//8;
switch (_ReadConfig.GetNodeValue("PARITY"))
{
case "None":
ss_port.Parity = Parity.None;
break;
case "Even":
ss_port.Parity = Parity.Even;
break;
case "Mark":
ss_port.Parity = Parity.Mark;
break;
case "Odd":
ss_port.Parity = Parity.Odd;
break;
case "Space":
ss_port.Parity = Parity.Mark;
break;
}
switch (_ReadConfig.GetNodeValue("STOP"))
{
case "1":
ss_port.StopBits = StopBits.One;
break;
case "1.5":
ss_port.StopBits = StopBits.OnePointFive;
break;
case "2":
ss_port.StopBits = StopBits.Two;
break;
}
ss_port.ReadTimeout = 600;
ss_port.WriteTimeout = 700;

ss_port.Open();//打开串口
return true;
}
catch (Exception ex)
{
throw new Exception("打开串口失败!\r\n错误信息:" + ex.Message);
}
}
#endregion

#region FreeDrv
/// <summary>
/// free opw
/// </summary>
public void FreeDrv()
{
try
{
if (ss_port != null)
{
ss_port.Close();
}
}
catch
{ }
}
#endregion

#region Write command to OPW
/// <summary>
/// 发操作命令给OPW设备
/// 并返回状态
/// </summary>
/// <param name="sCommand"></param>
/// <returns></returns>
public string WriteCommand(string sCommand)
{
StringBuilder sb = new StringBuilder();
bool bRead = true;
try
{
ss_port.DiscardInBuffer();
ss_port.Write(sCommand);
Thread.Sleep(1500);
while (bRead)
{
_ReadBuffer = new byte[ss_port.BytesToRead];
ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);
sb.Append(Encoding.ASCII.GetString(_ReadBuffer));
Thread.Sleep(500);
if (ss_port.BytesToRead <= 0)
{
bRead= false;
}
}
if (sb.ToString().Length== 0)
{
nReadCount++;
}

if (nReadCount == 3)
{
nReadCount = 0;
throw new Exception("设置不正确或没有联接设备!");
}
}
catch (Exception ex)
{
throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);
}
return sb.ToString(); ;
}

public string WriteCommand(byte[] bCommand)
{
StringBuilder sb = new StringBuilder();
bool bRead = true;
try
{
ss_port.DiscardInBuffer();
ss_port.Write(bCommand,0,bCommand.Length);
Thread.Sleep(1500);
while (bRead)
{
_ReadBuffer = new byte[ss_port.BytesToRead];
ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);
sb.Append(Encoding.ASCII.GetString(_ReadBuffer));
Thread.Sleep(500);
if (ss_port.BytesToRead <= 0)
{
bRead = false;
}
}
if (sb.ToString().Length == 0)
{
nReadCount++;
}

if (nReadCount == 3)
{
nReadCount = 0;
throw new Exception("设置不正确或没有联接设备!");
}
}
catch (Exception ex)
{
throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);
}
return sb.ToString();
}
#endregion

#region Get All COM Port
public string[] GetAllComPort()
{
string[] sAllPort = null;
try
{
sAllPort = SerialPort.GetPortNames();
}
catch (Exception ex)
{
throw new Exception("获取计算机COM口列表失败!\r\n错误信息:" + ex.Message);
}
return sAllPort;
}
#endregion
}

}
CraxyMouse 2008-10-13
  • 打赏
  • 举报
回复
你没有指定端,口,没有设计波特率,等一些属性!
//当前使用的串口
SerialPort sp = new SerialPort();
//你只判断了端口是否打开
// 没有打开的话也没有打开的语句
if (sp.IsOpen) //先判断串口是否打开
condition1 = true;
if (condition1 == true)//如果打开的话,在判断缓冲区中是否有数据
{
//接收缓冲区中数据的字节数。
//接收缓冲区包括串行驱动程序的接收缓冲区以及 SerialPort 对象自身的内部缓冲。
int rlen = sp.BytesToRead;
tete 2008-10-13
  • 打赏
  • 举报
回复
会不会是串口坏了
yagebu1983 2008-10-13
  • 打赏
  • 举报
回复
有响应吗??
wangyanboq 2008-10-13
  • 打赏
  • 举报
回复
sp 没有open
ericzhangbo1982111 2008-10-13
  • 打赏
  • 举报
回复
你先发送一条数据。
看看有没有数据返回

private void Receive_Load(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.PortName = "COM7";
serialPort1.BaudRate = 38400;
serialPort1.DataBits = 8;
serialPort1.StopBits = System.IO.Ports.StopBits.One;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.ReadTimeout = 100;

try
{
serialPort1.Open();
}
catch
{
MessageBox.Show(serialPort1.PortName + "開啟失敗");
return;
}
}

}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string carray = serialPort1.ReadExisting();

}

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧