I have a MT2070 scanner that needs to communicate to a PC app (send and receive). I have got the sending from the scanner to the PC going using ScannerServicesClient.SendLabel in the Symbol.MT2000.ScannerServices assembly.
I have not had any success however in receiving data sent from the PC intended for the scanner. I haven't managed to find anything in the Symbol.MT2000 assemblies that look like handling this or have I found any examples for receiving data.
If anyone can point me to an example or knows how I can achieve this it would be much appreciated.
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 never seems to be raised. Using SerialPort.GetPortNames() gives me COM1,COM2,COM4,COM5,COM9,$device\COM21,$device\COM23. I have tried setting the port to all of those except the last two (not sure if I'm supposed to add some device name for those)
UPDATE
Working solution
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);
}
}