2016-10-23 4 views
0

C#으로 응용 프로그램 직렬 포트를 구현하고이를 사용하여 데이터를 전송합니다. 하지만 작동하지 않습니다. "A"문자를 보내고 하드웨어가 작동하지 않습니다. 하지만 하이퍼 터미널 응용 프로그램이나 SimpleTerm으로 보내고 작동했습니다. 직렬 포트가 작동하지 않지만 하이퍼 터미널에서 작동합니다.

내 코드 응용 프로그램 : 어떻게 직렬 포트

if (_port.IsOpen) 
      { 
       _port.Close(); 
      } 
      _port.PortName = cmport.Text; 
      _port.Parity = (Parity)Enum.Parse(typeof(Parity), cmparity.Text); 
      _port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmstopbit.Text); 
      _port.DataBits = Convert.ToInt32(cmdatabit.Text); 
      _port.BaudRate = Convert.ToInt32(cmboundrate.Text); 
      _port.Handshake = Handshake.None; 
      if (!_port.IsOpen) 
        { 
         _port.Open(); 
        } 

        _port.Write(textBoxX1.Text.Trim()); 
+0

Handshake.RequestToSend를 사용하여 코드에서 _port.Close() 호출을 모두 삭제하십시오. –

답변

1

를 구성?

확인이 웹 사이트 : https://code.msdn.microsoft.com/windowsdesktop/SerialPort-brief-Example-ac0d5004

using System; 
using System.IO.Ports; 
using System.Text; 

namespace SerialPortExample 
{ 
    /// <summary> 
    /// Interfaces with a serial port. There should only be one instance 
    /// of this class for each serial port to be used. 
    /// </summary> 
    public class SerialPortInterface 
    { 
     private SerialPort _serialPort = new SerialPort(); 
     private int _baudRate = 9600; 
     private int _dataBits = 8; 
     private Handshake _handshake = Handshake.None; 
     private Parity _parity = Parity.None; 
     private string _portName = "COM1"; 
     private StopBits _stopBits = StopBits.One; 


    /// <summary> 
    /// Holds data received until we get a terminator. 
    /// </summary> 
    private string tString = string.Empty; 
    /// <summary> 
    /// End of transmition byte in this case EOT (ASCII 4). 
    /// </summary> 
    private byte _terminator = 0x4; 

    public int BaudRate { get { return _baudRate; } set { _baudRate = value; } } 
    public int DataBits { get { return _dataBits; } set { _dataBits = value; } } 
    public Handshake Handshake { get { return _handshake; } set { _handshake = value; } } 
    public Parity Parity { get { return _parity; } set { _parity = value; } } 
    public string PortName { get { return _portName; } set { _portName = value; } } 
    public bool Open() 
    { 
     try 
     { 
      _serialPort.BaudRate = _baudRate; 
      _serialPort.DataBits = _dataBits; 
      _serialPort.Handshake = _handshake; 
      _serialPort.Parity = _parity; 
      _serialPort.PortName = _portName; 
      _serialPort.StopBits = _stopBits; 
      _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); 
     } 
     catch { return false; } 
     return true; 
    } 

    void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     //Initialize a buffer to hold the received data 
     byte[] buffer = new byte[_serialPort.ReadBufferSize]; 

     //There is no accurate method for checking how many bytes are read 
     //unless you check the return from the Read method 
     int bytesRead = _serialPort.Read(buffer, 0, buffer.Length); 

     //For the example assume the data we are received is ASCII data. 
     tString += Encoding.ASCII.GetString(buffer, 0, bytesRead); 
     //Check if string contains the terminator 
     if (tString.IndexOf((char)_terminator) > -1) 
     { 
      //If tString does contain terminator we cannot assume that it is the last character received 
      string workingString = tString.Substring(0, tString.IndexOf((char)_terminator)); 
      //Remove the data up to the terminator from tString 
      tString = tString.Substring(tString.IndexOf((char)_terminator)); 
      //Do something with workingString 
      Console.WriteLine(workingString); 
     } 
    } 

} 
} 

은 textBoxX1.Text.Trim()가 최종 문자를 포함합니까? (_terminator) :

편집 : 컴 serveur에 데이터를 전송하는 전체 프로젝트. http://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners

저는 COM에 보내는 텍스트에 \ r \ n을 추가해야한다고 생각합니다. 이것은 포트 com에 줄이 완료되었음을 알려주고 읽을 것입니다.

이 시도 :

_port.Write(textBoxX1.Text.Trim() + "\r\n"); 
+0

_port.Write (textBoxX1.Text.Trim() + "\ r \ n")를 사용하는 경우); lcd 장치에 빈 문자를 인쇄하십시오. –

+0

\ n 또는 \ r이 클라이언트 버퍼를 닫지 않아야하기 때문에 이것이라고 생각합니다. \ r 또는 \ n 만 시도하십시오. 작동합니까? (심지어 빈 숯불) – pix

+0

나는 그것을 사용하려고하지만 작동하지 않습니다. 포트 USB 2.0은 12 문자를 보낼 수 있지만 USB 3.0을 사용하면 5 문자 이상을 보낼 수 없을 때 –

1

당신이 캐리지 리턴을 추가합니다 하이퍼 터미널을 사용하는 경우. 텍스트 뒤에 \ r을 추가해야합니다. 예 : A

관련 문제