C# ขอความช่วยเหลือ เรื่อง การรับข้อมูลทาง Serial Port
ลองดูครับ
Code (C#)
using System;
using System.IO.Ports;
using System.Threading;
public class PortChat
{
static bool _continue;
static SerialPort _serialPort;
public static void Main()
{
string name;
string message;
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
// Allow the user to set the appropriate properties.
_serialPort.PortName = SetPortName(_serialPort.PortName);
_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
_serialPort.Parity = SetPortParity(_serialPort.Parity);
_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);
// Set the read/write timeouts
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
_continue = true;
readThread.Start();
Console.Write("Name: ");
name = Console.ReadLine();
Console.WriteLine("Type QUIT to exit");
while (_continue)
{
message = Console.ReadLine();
if (stringComparer.Equals("quit", message))
{
_continue = false;
}
else
{
_serialPort.WriteLine(
String.Format("<{0}>: {1}", name, message) );
}
}
readThread.Join();
_serialPort.Close();
}
public static void Read()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
}
public static string SetPortName(string defaultPortName)
{
string portName;
Console.WriteLine("Available Ports:");
foreach (string s in SerialPort.GetPortNames())
{
Console.WriteLine(" {0}", s);
}
Console.Write("COM port({0}): ", defaultPortName);
portName = Console.ReadLine();
if (portName == "")
{
portName = defaultPortName;
}
return portName;
}
public static int SetPortBaudRate(int defaultPortBaudRate)
{
string baudRate;
Console.Write("Baud Rate({0}): ", defaultPortBaudRate);
baudRate = Console.ReadLine();
if (baudRate == "")
{
baudRate = defaultPortBaudRate.ToString();
}
return int.Parse(baudRate);
}
public static Parity SetPortParity(Parity defaultPortParity)
{
string parity;
Console.WriteLine("Available Parity options:");
foreach (string s in Enum.GetNames(typeof(Parity)))
{
Console.WriteLine(" {0}", s);
}
Console.Write("Parity({0}):", defaultPortParity.ToString());
parity = Console.ReadLine();
if (parity == "")
{
parity = defaultPortParity.ToString();
}
return (Parity)Enum.Parse(typeof(Parity), parity);
}
public static int SetPortDataBits(int defaultPortDataBits)
{
string dataBits;
Console.Write("Data Bits({0}): ", defaultPortDataBits);
dataBits = Console.ReadLine();
if (dataBits == "")
{
dataBits = defaultPortDataBits.ToString();
}
return int.Parse(dataBits);
}
public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
{
string stopBits;
Console.WriteLine("Available Stop Bits options:");
foreach (string s in Enum.GetNames(typeof(StopBits)))
{
Console.WriteLine(" {0}", s);
}
Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString());
stopBits = Console.ReadLine();
if (stopBits == "")
{
stopBits = defaultPortStopBits.ToString();
}
return (StopBits)Enum.Parse(typeof(StopBits), stopBits);
}
public static Handshake SetPortHandshake(Handshake defaultPortHandshake)
{
string handshake;
Console.WriteLine("Available Handshake options:");
foreach (string s in Enum.GetNames(typeof(Handshake)))
{
Console.WriteLine(" {0}", s);
}
Console.Write("Handshake({0}):", defaultPortHandshake.ToString());
handshake = Console.ReadLine();
if (handshake == "")
{
handshake = defaultPortHandshake.ToString();
}
return (Handshake)Enum.Parse(typeof(Handshake), handshake);
}
}
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx#Y3884
Date :
2011-12-02 06:33:32
By :
webmaster
ขอบคุณมากครับ เดี๊ยวจะลองทำตาม
Date :
2011-12-02 08:19:44
By :
smallBB
ผมลองนำโค้ดไปทำตามดูแล้วปรากฎว่า มันไม่ขึ้น error ไม่สามารถรับข้อมูลได้
แล้วการทำงานมันไปหยุดอยู่ที่ บรรทัด 084 portName = Console.ReadLine();
แล้วจากนั้นมันก็ไม่ทำงานต่อครับ
ขอความช่วยเหลือด้วยนะครับ
อีกอย่างนะครับ ผมอยากทราบว่าฟังก์ชันไหนที่ทำให้โปรแกรมสามารถรับข้อมูลได้ตลอดเวลา เพราะว่าข้อมูลที่ส่งเข้ามาจะส่งเข้ามาเรื่อยๆครับ
Date :
2011-12-02 16:43:03
By :
smallBB
ผมไม่มีอุปรกรณ์เลยทดสอบไม่ได้ครับ คุณน่าจะหาทางได้น่ะครับ มันก็เกือบได้แล้วนี่ครับ
Date :
2011-12-03 06:15:49
By :
webmaster
smallBB ผมไม่เเน่ใจว่าคุณทำได้รึยังนะครับ มีอีก 1 ทางเลือกครับผมเขียนเป็น .dll ไว้เเล้วเรียกใช้ได้เลยครับ ลองดูโค๊ตการเรียกใช้ได้ก่อนครับถ้าสนใจทิ้งเมล์ไว้ครับ เดียวส่งไฟล์ไปให้ทางเมล์ครับ
Code (C#)
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 ManageComPort;
namespace TestComport
{
public partial class Form1 : Form
{
EasyComPort runPort = new EasyComPort(1000);//set time read data on 1000 millisec
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
runPort.OnConnectPort += new EasyComPort.OnConnectEventHandler(runPort_OnConnectPort); //----------------------------|
runPort.OnReciveDataPort += new EasyComPort.OnReciveDatEventHandler(runPort_OnReciveDataPort); // |
runPort.OnDisconnectPort += new EasyComPort.OnDisconnectEventHandler(runPort_OnDisconnectPort); // Add Event |
runPort.ErrorPort += new EasyComPort.ErrorPortEventHandler(runPort_ErrorPort); //----------------------------|
runPort.SetPortNameValues(cbo_Port);//get portname online
}
private void runPort_OnConnectPort() //on connect
{
lbl_Status.Text = "Connected";
lbl_Status.BackColor = Color.Green;
btn_Connect.Text = "Disconnect";
}
private void runPort_OnReciveDataPort(string data) // recive data on 1000 milli
{
tbx_Log.Text += data+"\r\n";
}
private void runPort_OnDisconnectPort() // on disconnect
{
lbl_Status.Text = "No Connect";
lbl_Status.BackColor = Color.Red;
btn_Connect.Text = "Connect";
}
private void runPort_ErrorPort(string error) // on error
{
tbx_Log.Text += error + "\r\n";
}
private void btn_Connect_Click(object sender, EventArgs e)
{
if (lbl_Status.Text == "No Connect")
runPort.ConnectPort(cbo_Port.Text, 9600);
else
runPort.DisconnectPort();
}
private void btn_Send_Click(object sender, EventArgs e)
{
runPort.SendData(tbx_Msg.Text);
}
}
}
Date :
2011-12-03 13:04:46
By :
Kotakin
ครับผม
พอดีผมทำได้แล้วครับโค้ดประมาณนี้ครับ
Code (C#)
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.IO.Ports;
namespace Test_SerialPort
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort port = new SerialPort();
private void Form1_Load(object sender, EventArgs e)
{
fetch_comport();
}
private void fetch_comport()
{
string[] portNames = System.IO.Ports.SerialPort.GetPortNames();
comboBox1.Items.Clear();
for (int i = 0; i <= portNames.Length - 1; i++)
{
comboBox1.Items.Add(portNames[i]);
}
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
private void bt_RefreshPort_Click(object sender, EventArgs e)
{
fetch_comport();
}
private void bt_openport_Click(object sender, EventArgs e)
{
try
{
port.PortName = comboBox1.Text;
port.BaudRate = 9600;
port.StopBits = System.IO.Ports.StopBits.One;
port.DataBits = 8;
port.Parity = System.IO.Ports.Parity.None;
textBox1.Text = port.PortName;
textBox2.Text = port.BaudRate.ToString();
textBox3.Text = port.Parity.ToString();
textBox4.Text = port.DataBits.ToString();
textBox5.Text = port.StopBits.ToString();
port.Open();
}
catch (Exception ex){
MessageBox.Show(ex.Message);
}
}
private void bt_clear_Click(object sender, EventArgs e)
{
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = "";
textBox5.Text = "";
}
private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
{
//---invoke the delegate to retrieve the received data---
textBox6.BeginInvoke(new myDelegate(updateTextBox));
}
public delegate void myDelegate();
public void updateTextBox()
{
//---append the received data into the TextBox control---
textBox6.AppendText(port.ReadExisting());
textBox6.ScrollToCaret();
}
private void bt_closeport_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
}
}
ใช้ port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); เป็นตัวตรวจสอบว่ามีข้อมูลเข้ามาตอนไหนแล้วไปเรียกใช้ DataReceivedHandler เพื่อแสดงค่าที่ได้รับเข้ามาครับ
Date :
2011-12-03 14:45:10
By :
smallBB
ผมต้องการรับค่า จาก ๅSerialport มาที่เครื่อง Computer ช่วยแนะนำ Code ทีครับ
Date :
2013-03-12 11:12:52
By :
pisanu2527
มีตัวอย่าง form มั้ยครับ
Date :
2013-03-17 14:05:24
By :
pod
Load balance : Server 02