デバイスのポートに 16 進コードを書き込む ac# コードがあります。ポートのデバイス応答、私は彼の答えを読み、それを 16 進数に変換してテキスト ボックスに表示しました。そのため、回答の各ビットをチェックして、テキスト ボックスなどにメッセージを表示する必要があります。
誰でも私を助けてもらえますか?
前もって感謝します。
デバイスのポートに 16 進コードを書き込む ac# コードがあります。ポートのデバイス応答、私は彼の答えを読み、それを 16 進数に変換してテキスト ボックスに表示しました。そのため、回答の各ビットをチェックして、テキスト ボックスなどにメッセージを表示する必要があります。
誰でも私を助けてもらえますか?
前もって感謝します。
チェックしたいビットとビットごとの AND 応答:
Byte response = (Byte)0xFF;
Boolean isBitOneSet = (response & 0x1) > 0;
Boolean isBitTwoSet = (response & 0x2) > 0;
Boolean isBitThreeSet = (response & 0x4) > 0;
または右シフトを使用します。
Boolean isBitFiveSet = ((response >> 4) & 0x1) > 0;
if(isBitFiveSet) System.Windows.MessageBox.Show("Five is set");
数値のバイナリ表現が必要な場合は、 Convert.ToString()メソッドを使用できます。これは、すべてのビットを個別にチェックするよりもはるかに簡単で効率的です。このメソッドは、バイナリ形式と HEX 形式に変換できます。
Ferdinand は、個々のビットをチェックする方法をすでに説明しました。多分それは十分に明確ではありませんでした。
したがって、すべてのバイトのすべてのビットをチェックするには、次のようにコードを白くする必要があります。
StringBuilder message = new StringBuilder();
for (int byteNum = 0; byteNum < bytes.Length; byteNum++)
{
var responseByte = bytes[byteNum];
for (int bitPos = 0; bitPos < 8; bitPos++)
{
message.AppendFormat("Byte {0} bit {1} value is {2}", byteNum, bitPos, (responseByte & (1<<bitPos)) != 0);
}
}
より明確になったことを願っています。夜に変更したいのは、バイトとビットの順序だけです。ビット シーケンスがどのようにバイト配列に変換されるのかはよくわかりません。0 番目のビットは実際にはバイトの最後にある可能性があります。
namespace read_display_data
{ public 部分クラス Form1 : Form {
SerialPort port = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
port.Open();
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
}
private void Sendbutton_Click(object sender, EventArgs e)
{
port.Write(new byte[] { 0x55, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x5D }, 0, 8)
byte[] buffer1 = new byte[] { 0x55, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x5D };
Log1(LogMsgType.Outgoing, DateTime.Now + " -- " + ByteArrayToHexString(buffer1) + "\n");
}
public enum LogMsgType { Incoming, Outgoing, Normal };
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytes = port.BytesToRead;
byte[] buffer = new byte[bytes];
port.Read(buffer, 0, bytes);
Thread.Sleep(100);
Log(LogMsgType.Incoming, DateTime.Now + " -- " + ByteArrayToHexString(buffer) + "\n");
Log2(LogMsgType.Incoming, DateTime.Now + " -- " + GetInBinaryString(buffer) + "\n");
}
private string ByteArrayToHexString(byte[] buffer)
{
StringBuilder sb = new StringBuilder(buffer.Length * 3);
foreach (byte b in buffer)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
return sb.ToString().ToUpper();
}
private string GetInBinaryString(byte[] buffer)
{
StringBuilder sb = new StringBuilder(buffer.Length * 8);
foreach (byte b in buffer)
sb.Append(Convert.ToString(b, 2).PadLeft(8, '0').PadRight(5, ' '));
return sb.ToString().ToUpper();
}
private void Log(LogMsgType msgtype, string msg)
{
textBox1.Invoke(new EventHandler(delegate
{
textBox1.SelectedText = string.Empty;
textBox1.AppendText(msg);
textBox1.ScrollToCaret();
}
));
}
private void Log1(LogMsgType msgtype, string msg)
{
textBox2.Invoke(new EventHandler(delegate
{
textBox2.SelectedText = string.Empty;
textBox2.AppendText(msg);
textBox2.ScrollToCaret();
}
));
}
private void Log2(LogMsgType msgtype, string msg)
{
textBox3.Invoke(new EventHandler(delegate
{
textBox3.SelectedText = string.Empty;
textBox3.AppendText(msg);
textBox3.ScrollToCaret();
}
));
}