Сканер Symbol MT2070 получает данные с ПК - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть сканер MT2070, который должен общаться с приложением ПК (отправлять и получать).Я получил отправку со сканера на ПК с использованием ScannerServicesClient.SendLabel в сборке Symbol.MT2000.ScannerServices.

Однако я не добился успеха в получении данных, отправленных с ПК, предназначенного для сканера.Мне не удалось найти что-либо в сборках 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.Я попытался установить порт для всех тех, кроме последних двух (не уверен, если я должен добавить какое-то имя устройства для них)

ОБНОВЛЕНИЕ

Работаетрешение

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);
}

}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Не уверен, если вам все еще нужен ответ для вашей проблемы MT2070 - есть метод ReadRawData для чтения с компьютера.

Кроме того, он должен быть в режиме Raw, используя что-то вроде:

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

Также, если вы используете Bluetooth SPP, это не будет работать.Должен быть через подставку (если есть) или напрямую к USB-кабелю.

0 голосов
/ 28 февраля 2012

Хороший общий пример можно найти по адресу inthehand.com # 2522 .

Также здесь есть хороший пример в Вопрос о переполнении стека 1528379 .Он говорит, что отказался от встроенного COM-порта и использовал соединение через последовательный порт для установления своего соединения.Похоже, это тот путь, который я делал в прошлом, и он также не привязывает вас к проприетарной DLL-библиотеке Symbol.

РЕДАКТИРОВАТЬ:

ДонНе знаю, может ли это когда-нибудь помочь, но вот старый фрагмент кода, который я написал несколько лет назад.

Вам придется его почистить, чтобы он работал для вашего приложения.Мое приложение имело элемент управления TextBox, из которого оно читало, и регистрировало ошибки в классе Global.Измените это, чтобы работать с тем, что у вас есть, и это в принципе должно быть хорошо.

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);
    }
  }

}
...