【发布时间】:2018-02-14 04:44:24
【问题描述】:
我有一台 MT2070 扫描仪,需要与 PC 应用程序通信(发送和接收)。我已经使用 Symbol.MT2000.ScannerServices 程序集中的 ScannerServicesClient.SendLabel 将扫描仪发送到 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。我已经尝试将端口设置为除最后两个之外的所有端口(不确定是否应该为这些端口添加一些设备名称)
更新
工作解决方案
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);
}
}
【问题讨论】:
-
您是通过无线网络、蓝牙还是红外线发送数据?您可以发布一些示例代码吗?
-
@jp2code 蓝牙。没有用于接收的示例代码,因为甚至没有找到任何看起来可以完成这项工作的东西。
-
@JKF,我可以得到从扫描仪发送到PC的示例代码吗?谢谢。
-
@soclose 在上面的更新中添加。
-
谢谢你,@JKF。我已经部署了 MC 3000 / 55 / 65。但是在 MT2070 中,它无法运行 CAB 文件。请分享一些信息。
标签: c# compact-framework