2012-02-27 2 views
0

PC 앱과 통신 (송수신)해야하는 MT2070 스캐너가 있습니다. Symbol.MT2000.ScannerServices 어셈블리에서 ScannerServicesClient.SendLabel을 사용하여 PC에서 스캐너로 보내는 중입니다.Symbol MT2070 스캐너가 PC에서 데이터를 수신 중입니다.

그러나 스캐너 용 PC에서 보낸 데이터를 수신하지 못했습니다. Symbol.MT2000 어셈블리에서 아무 것도 찾을 수 없었습니다.이를 처리하거나 데이터 수신에 대한 예제를 찾았습니다.

누군가가 나를 예를 들어 설명해 주거나 내가 이걸 성취 할 수있는 방법을 안다면 많은 도움이 될 것입니다.

private readonly SerialPort _port = new SerialPort() 

private void SetupPort() 
{ 
    _port.PortName = "COM1"; 
    _port.BaudRate = 9600; 
    _port.DataBits = 8; 
    _port.Parity = Parity.None; 
    _port.StopBits = StopBits.One; 

    try 
    { 
    _port.Open(); 
    _port.DataReceived += PortDataReceived; 
    _port.ErrorReceived += PortErrorReceived; 
    } 
    catch (Exception Ex) 
    { 
    OnCommsMessage("Exception opening port: " + Ex.Message); 
    } 
} 

private void PortDataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    OnCommsMessage("PortDataReceived"); 
} 

private void PortErrorReceived(object sender, SerialErrorReceivedEventArgs e) 
{ 
    OnCommsMessage("PortErrorReceived"); 
} 

DataReceived는 절대로 제기되지 않습니다. SerialPort.GetPortNames()를 사용하면 COM1, COM2, COM4, ​​COM5, COM9, $ device \ COM21, $ device \ COM23이 표시됩니다.

UPDATE (I는 사람들을 위해 몇 가지 장치 이름을 추가하기로되어있어 확실하지) 나는 지난 2를 제외하고 사람들의 모든 포트를 설정 시도

작업 솔루션

internal class MT2000CradleCommunicator : BaseCradleCommunicator 
{ 
private readonly ScannerServicesClient _scannerServicesClient = new ScannerServicesClient(); 


public override void Start() 
{ 
    if (_scannerServicesClient.Connect(true)) 
    { 
    OnCommsMessage("ScannerServicesClient Connected"); 
    SetRawMode(); 
    } 
    else OnCommsMessage("ScannerServicesClient Failed to connect"); 
} 

public override void Send(string message) 
{ 
    RESULTCODE result = _scannerServicesClient.SendRawData(MessageToRawData(message), 1000); 
    if (result == RESULTCODE.E_OK) 
    { 
    Receive(); 
    } 
    else OnCommsMessage("Error sending data: " + result); 
} 

private void SetRawMode() 
{ 
    const int ATTRIBUTE_NUM_WIRED_HOST_NUM = 383; 
    const byte API_HOST_RAW = 18; 

    ScannerHostParameters hostParameters = new ScannerHostParameters(_scannerServicesClient); 
    RawParameters rawHostParameters; 
    RESULTCODE result = hostParameters.GetRawParameters(out rawHostParameters); 
    if (result == RESULTCODE.E_OK) 
    { 
    rawHostParameters.Type = RawParameters.RawHostType.RS232; 
    rawHostParameters.BaudRate = RawParameters.RawBaudRates.RAWSERIAL_9600; 
    result = hostParameters.StoreRawParameters(rawHostParameters); 
    if (result != RESULTCODE.E_OK) 
     OnCommsMessage("Set Parameters failed: " + result); 
    } 
    else OnCommsMessage("GetParams failed: " + result); 

    byte wHostNum; 
    result = _scannerServicesClient.GetAttributeByte(ATTRIBUTE_NUM_WIRED_HOST_NUM, out wHostNum); 
    if (result == RESULTCODE.E_OK) 
    { 
    OnCommsMessage("Get host: " + wHostNum); 
    result = _scannerServicesClient.SetAttributeByte(ATTRIBUTE_NUM_WIRED_HOST_NUM, API_HOST_RAW); 
    if (result != RESULTCODE.E_OK) 
     OnCommsMessage("Set host failed: " + result); 
    } 
    else OnCommsMessage("Get host failed: " + result); 
} 

private static RawData MessageToRawData(string message) 
{ 
    byte[] bytes = Encoding.ASCII.GetBytes(message); 
    return new RawData(bytes, bytes.Length, 1); 
} 

private void Receive() 
{ 
    RawData rawData; 
    RESULTCODE result = _scannerServicesClient.ReadRawData(out rawData, 5000); 
    if (result == RESULTCODE.E_OK) 
    { 
    OnCradleMessageReceived(BytesToAsciiString(rawData.Data)); 
    } 
    else 
    { 
    OnCommsMessage("Comms timeout: Failed to receive data"); 
    } 
} 

private static string BytesToAsciiString(byte[] data) 
{ 
    return Encoding.ASCII.GetString(data, 0, data.Length); 
} 

}

+0

무선 네트워크를 통해 Bluetooth 또는 Infra Red를 통해 데이터를 보내십니까? 게시 할 수있는 몇 가지 샘플 코드가 있습니까? – jp2code

+0

@ jp2code 블루투스. 수신을위한 샘플 코드가 없기 때문에 작업을 수행 할 수있는 것처럼 보이지 않습니다. – JKF

+0

@ JKF, 스캐너에서 PC로 보내는 샘플 코드를 얻을 수 있습니까? 고맙습니다. – soclose

답변

0

확실하지. 이 작동하지 않습니다 블루투스 SPP를 사용하는 경우, 또한도

myScannerSvcClient.SetAttributeByte(
    (ushort)ATTRIBUTE_NUMBER.ATT_MIA_HOSTNUM, 
    (byte)ENUM_HOSTS.HOST_RAW 
    ); 

:

또한, 같은 것을 사용하여 원시 모드에 있어야합니다. 크래들 (있는 경우)을 통과하거나 USB 케이블로 직접 연결해야합니다.

+0

이것은 내가 끝내었던 것이었다. – JKF

0

inthehand.com #2522에는 좋은 일반적인 예가 있습니다.

또한 여기에 좋은 예가 Stack Overflow Question 1528379입니다. 그는 COM 포트에 내장 된 것을 포기하고 직렬 포트 연결을 사용하여 연결을 설정했다고 말했습니다. 그것은 내가 과거에 해왔 던 경로 인 것처럼 보이며 Symbol의 독점적 인 DLL에도 묶이지 않습니다.

편집 :

이 이제까지 도울 수 있다면 나는 모르겠지만, 여기에 내가 몇 년 전에 쓴 코드의 오래 된 조각입니다.

응용 프로그램에서 작동하도록 정리해야합니다. 내 응용 프로그램은 TextBox 컨트롤을 읽고 전역 클래스에 오류를 기록했습니다. 당신이 가지고있는 것과 함께 일하도록 변화 시키면, 기본적으로 좋을 것입니다. 컴퓨터에서 읽을 ReadRawData라는 방법이있다 - 당신은 여전히 ​​당신의 MT2070의 문제에 대한 답을해야하는 경우

static class Scanner { 

    const string _CODEFILE = "Scanner.cs - Scanner::"; 
    static int _baud = 9600; 
    static int _bits = 8; 
    static string _dataIn = null; 
    static string _port = "COM1"; 
    static Parity _parity = Parity.None; 
    static StopBits _stop = StopBits.One; 
    static SerialPort _com1 = null; 
    static TextBox _textbox = null; 
    public enum ControlType { None, BadgeID, PartNumber, SerialNumber, WorkOrder }; 
    static ControlType _control; 

    public static bool Available { get { return ((_com1 != null) && (_com1.IsOpen)); } } 

    public static bool Close { 
    get { 
     if (_com1 == null) return true; 
     try { 
     if (_com1.IsOpen) { 
      _com1.Close(); 
     } 
     return (!_com1.IsOpen); 
     } catch { } 
     return false; 
    } 
    } 

    public static string Open() { 
    const string na = "Not Available"; 
    if (_com1 == null) { 
     string reset = Reset(); 
     if (!String.IsNullOrEmpty(reset)) return reset; 
    } 
    try { 
     _com1.Open(); 
     return (_com1.IsOpen) ? null : na; 
    } catch (Exception err) { 
     return err.Message; 
    } 
    } 

    static void ProcessData(string incoming) { 
    _dataIn += incoming; 
    if ((_control != ControlType.None) && (_textbox != null)) { 
     bool ok = false; 
     string testData = _dataIn.Trim(); 
     switch (_control) { 
     case ControlType.BadgeID: 
      if (testData.Length == 6) { 
      if (testData != BarCode.LOGOFF) { 
       Regex pattern = new Regex(@"[0-9]{6}"); 
       ok = (pattern.Matches(testData).Count == 1); 
      } else { 
       ok = true; 
      } 
      } 
      break; 
     case ControlType.PartNumber: 
      if (testData.Length == 7) { 
      Regex pattern = new Regex(@"[BCX][P057][0-9]{5}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     case ControlType.SerialNumber: 
      if (testData.Length == 15) { 
      Regex pattern = new Regex(@"[BCX][P057][0-9]{5} [0-9]{4} [0-9]{2}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     case ControlType.WorkOrder: 
      if (testData.Length == 6) { 
      Regex pattern = new Regex(@"[0-9]{6}"); 
      ok = (pattern.Matches(testData).Count == 1); 
      } 
      break; 
     } 
     if (ok) { 
     _textbox.Text = testData; 
     _textbox.ScrollToCaret(); 
     _dataIn = null; 
     } 
    } 
    } 

    static string Reset() { 
    if (_com1 != null) { 
     try { 
     if (_com1.IsOpen) { 
      _com1.DiscardInBuffer(); 
      _com1.Close(); 
     } 
     } catch (Exception err) { 
     return err.Message; 
     } 
     Global.Dispose(_com1); 
     _com1 = null; 
    } 
    try { 
     _com1 = new SerialPort(_port, _baud, _parity, _bits, _stop); 
     _com1.DataReceived += new SerialDataReceivedEventHandler(Serial_DataReceived); 
     _com1.Open(); 
    } catch (Exception err) { 
     return err.Message; 
    } 
    return null; 
    } 

    public static void ScanSource(ref TextBox objTextBox, ControlType objType) { 
    _textbox = objTextBox; 
    _control = objType; 
    _dataIn = null; 
    } 

    static void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
    ProcessData(_com1.ReadExisting()); 
    } 

    public static void Settings(string ComPort, int BaudRate, Parity ParityValue, int Bits, StopBits StopBit) { 
    _port = ComPort; 
    _baud = BaudRate; 
    _parity = ParityValue; 
    _bits = Bits; 
    _stop = StopBit; 
    } 

    /// <summary> 
    /// Closes the COM Port 
    /// COM Port routines are ready to add as soon as I am 
    /// </summary> 
    static bool ComPortClose { 
    get { 
     if (_com1 == null) ComPortReset(); 
     return ((_com1 == null) ? true : _com1.IsOpen ? false : true); 
    } 
    set { 
     if (_com1 == null) ComPortReset(); 
     else if (_com1.IsOpen) { 
     _com1.DiscardInBuffer(); 
     _com1.Close(); 
     } 
    } 
    } 
    /// <summary> 
    /// Opens the COM Port 
    /// </summary> 
    static bool ComPortOpen { 
    get { 
     if (_com1 == null) ComPortReset(); 
     return (_com1 == null) ? false : _com1.IsOpen; 
    } 
    set { 
     if (_com1 == null) ComPortReset(); 
     if ((_com1 != null) && (!_com1.IsOpen)) _com1.Open(); 
    } 
    } 
    /// <summary> 
    /// Initialized the Serial Port on COM1 
    /// </summary> 
    static void ComPortReset() { 
    if ((_com1 != null) && (_com1.IsOpen)) { 
     _com1.Close(); 
     _com1 = null; 
    } 
    try { 
     _com1 = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 
    } catch (IOException err) { 
     Global.LogError(_CODEFILE + "ComPortReset", err); 
    } 
    } 

} 
+0

나는 여전히 작동하지 못하는 샘플 코드로 질문을 업데이트했습니다. – JKF

+0

큰 코드를 추가했습니다. 조각? 그렇지 않아. 이것은 내 전체 직렬 읽기 응용 프로그램이었습니다. – jp2code

+1

코드를 사용하여 DataReceived 이벤트가 발생하지 않습니다. 나는 원래의 질문에 답한 것처럼 답을 표시했다. 도움에 감사드립니다. – JKF

관련 문제