一般跟下位机通信发地址时校验位用MARK,发数据时校验位用SPACE。
解决方案 »
- crc 文件校验
- StringBuilder 小问题
- textbox相关问题
- C#中局域网中客户端远程调用服务器上的数据库,有没什么高效方法?
- 没有为任何调用堆栈框架加载任何符号。无法显示源代码
- 请教如何用DataList控件和Repeater控件怎么实现对比效果??,,每两个进行对比。。急!!!
- .net 怎样对图片操作
- 请问asp.net中的server.mappath("~\\database\\a.mdb") 在winform中对应什么方法()
- C#中form切换时,form上已改变位置的控件被初始化
- 各位大佬小弟现在有难题论坛的显示回复这一页不知点样写,帮下忙吧!
- C#嵌入excel出错
- c# 自動獲取列名問題 ??
兄弟,一般速度常用的是19200,38400等等
你这里开个300,不行哦!你需要确认下位机的串口通讯参数,速度、效验、停止位。
这是对的,和仪器要求的一样!
仪器所说的那些握手信号你不用去管他,如果你是标准的串口,信号就是标准的.
你程序死机是不是没有读到返回的信息啊.串口程序一般做法是 :
加一句
serialPort1 .DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);给仪器下指令串口
serialPort1.Write("G"+ "\r\n");如果串口有了仪器返回的信息,则触发DataReceived事件
你就直接在事件中写程序就行了.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //与接收机交换数据的串口有数据过来时
{
if(读到的是"Y")
{ 指令成功;
}
else if(读到的是"X")
{
指令失败;
}
}
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.IO.Ports;
using System.Threading;namespace mycom
{
public partial class Form1 : Form
{
SerialPort spcom = new SerialPort(); delegate void HandleInterfaceUpdateDelegate(string text); //委托
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
spcom.PortName = "COM1";
spcom.BaudRate = 4800;
spcom.Parity = Parity.None;
spcom.DataBits = 8;
spcom.StopBits = StopBits.One;
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);
spcom.DataReceived += new SerialDataReceivedEventHandler(spcom_DataReceived);
spcom.ReceivedBytesThreshold = 1; try
{ spcom.Open();
}
catch
{
MessageBox.Show("没有找到串口,请检查后再试……", "警告");
}
}
public void spcom_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ /* if (!spcom.IsOpen)
{
spcom.Open();
}*/
byte[] readBuffer = new byte[spcom.ReadBufferSize];
spcom.Read(readBuffer, 0, readBuffer.Length);
// readBuffer= spcom.ReadLine();
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
} private void UpdateTextBox(string text)
{
txtrev.Text += text; }
//发送数据
private void butsend_Click(object sender, EventArgs e)
{
//发送数据
SendStringData(spcom);
// txtsend.Text = "\n";
// SendBytesData(spcom); } //发送字符串数据
private void SendStringData(SerialPort serialPort)
{
try
{
if (!spcom.IsOpen)
{ spcom.Open(); } spcom.Write(txtsend.Text);
}
catch
{
MessageBox.Show("没有找到串口,请先打开串口","警告");
}
// spcom.Close();
} //发送二进制数据
private void SendBytesData(SerialPort serialPort)
{
byte[] bytesSend = Encoding.Default.GetBytes(txtsend.Text);
spcom.Write(bytesSend, 0, bytesSend.Length);
} private void butrev_Click(object sender, EventArgs e)
{
txtrev.Text = "";
}
private void txtsend_TextChanged(object sender, EventArgs e)
{
}
private void txtrev_TextChanged(object sender, EventArgs e)
{
txtrev.SelectionStart = txtrev.Text.Length;
txtrev.SelectionLength = 0;
txtrev.ScrollToCaret();
}
}
}
经测试过好用,你可以COPY去试试