私は以前開発したC#/ .NETプロジェクトの再構築/改良に取り組んでいます。 シリアルコミュニケータは128-255バイトを特殊文字列に変換できません。私はこのプロジェクトの作業バージョンで見られる文字に基づいてUnicodeエンコーディングを適用しようとしました。エンコードが適用されると、「メッセージの送信に失敗しました」というメッセージがスローされます。この問題をさらに解決するためのあらゆる指針は非常に高く評価されています。おかげさまで バイトの文字列表現128-255
public virtual string WriteData(string s, int expectedResponseLength)
{
lock (messageLock)
{
resetEvent.Reset();
}
message = string.Format("WriteData: {0}\r\nMessageType={1}\r\n", s, MessageType.Outgoing);
expectedLength = expectedResponseLength;
if (!comPort.IsOpen)
comPort.Open();
byte[] bs = new byte[s.Length];
for (int i = 0; i < s.Length; ++i)
bs[i] = (byte)s[i];
for (int i = 0; i < 3; i++)
{
response = string.Empty;
comPort.Write(bs, 0, bs.Length);
if (resetEvent.WaitOne(5000))
{
return response;
}
}
throw new Exception("Message failed to send.");
}
public virtual bool OpenPort()
{
try
{
if (comPort.IsOpen)
comPort.Close();
comPort.Encoding = new UnicodeEncoding();
comPort.DtrEnable = false;
comPort.RtsEnable = false;
comPort.ReceivedBytesThreshold = 1;
comPort.ReadTimeout = -1;
comPort.ReadBufferSize = 1024;
comPort.BaudRate = int.Parse(BaudRate);
comPort.DataBits = int.Parse(DataBits);
comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits);
comPort.PortName = PortName;
comPort.Open();
message = string.Concat("OpenPort: ", MessageType.Normal, ", Port opened at ", DateTime.Now);
return true;
}
catch (Exception ex)
{
message = "OpenPort: " + MessageType.Error + ex.Message;
return false;
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string RcvByte = comPort.ReadExisting();
// Encode the string.
byte[] encodedBytes = Encoding.Unicode.GetBytes(RcvByte);
// Decode bytes back to string.
RcvByte = Encoding.Unicode.GetString(encodedBytes);
response += RcvByte;
lock (messageLock)
{
if (response.Length >= expectedLength)
{
resetEvent.Set();
}
}
}
送信する前にBase64としてエンコードしてください。それは大きくなりますが、Base64でエンコードされたバイトは明確に定義された文字を持ちます。あなたはもう一方の側でそれを解読する必要がありますが、送信メカニズムはもはやチョークしてはいけません。 –
@Bertus:Unicodeで始まっているのであれば、UTF-7もうまく動作します。 – Joey
作業バージョンでは、Unicodeエンコーディングと同じöにマップされたF6が表示されます。 UTF7はこの文字を2バイトにマップします。私はBase64エンコーディングを調べます。ありがとう。 – PAN