는 I는 장치 포트에 16 진수 코드를 쓰기 C# 코드가 C#으로 설정되어 있는지 확인하는 방법. 장치가 포트에 응답하고, 그의 대답을 읽고, 그것을 16 진수로 변환하고 텍스트 상자에 표시합니다. 이제 답변에서 각 비트를 확인하고 텍스트 상자에 메시지를 표시하거나 그와 같은 메시지를 표시해야합니다.버퍼 내의 특정 비트가
아무도 도와 줄 수 있습니까?
미리 감사드립니다.
는 I는 장치 포트에 16 진수 코드를 쓰기 C# 코드가 C#으로 설정되어 있는지 확인하는 방법. 장치가 포트에 응답하고, 그의 대답을 읽고, 그것을 16 진수로 변환하고 텍스트 상자에 표시합니다. 이제 답변에서 각 비트를 확인하고 텍스트 상자에 메시지를 표시하거나 그와 같은 메시지를 표시해야합니다.버퍼 내의 특정 비트가
아무도 도와 줄 수 있습니까?
미리 감사드립니다.
비트 AND 검사 할 비트 응답 :
Byte response = (Byte)0xFF;
Boolean isBitOneSet = (response & 0x1) > 0;
Boolean isBitTwoSet = (response & 0x2) > 0;
Boolean isBitThreeSet = (response & 0x4) > 0;
또는 사용 오른쪽 시프트 : 당신이 숫자의 이진 표현을해야하는 경우가 Convert.ToString() 방법을 사용할 수 있습니다
Boolean isBitFiveSet = ((response >> 4) & 0x1) > 0;
if(isBitFiveSet) System.Windows.MessageBox.Show("Five is set");
- 모든 단일 비트를 개별적으로 검사하는 것보다 훨씬 간단하고 효율적입니다. 이 방법은 원하는대로 이진 및 HEX 형식으로 변환 할 수 있습니다.
이진 표현이 필요 없어, 각 바이트에서 각 비트를 확인해야합니다. 장치에서 내 대답은 16 진수 형식으로 13 바이트, 그래서 내가 104 비트를 확인해야합니다. 나는이 작업을 수행해야 – gheo
는 생각 : 1. 첫째로 나는 X 바이트가 설정되어있는 경우 등, 두 번째 또는 세 번째 물린 (확인 여부를 확인 설정되어있는 경우 나 디스플레이를 텍스트 상자에 하나의 메시지를 원하는 모든 물린 2.Secondly을 선택해야합니다 한 번 정수를 확인합니다 경우 1 "직렬 COMUNICATION 확인, 다른 직렬 통신 에러 등") – gheo
가 그럼 난 페르디난드의 추천에 동의합니다.하지만 함께 "> 0"을 대체하는 것이 좋습니다! "= 0".이 때문에, 당신은 할 수 GE t 음의 값. –
namespace read_display_data
{ 공공 부분 Form1 클래스 : 양식 {
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();
}
));
}
이것은 내 C# 코드이며 여전히 문제가 있습니다. 누구든지 나를 도와 줄 수 있습니까? – gheo
새로운 문제를 설명해 주시겠습니까?첫 번째 게시물에서 바이너리를 문자열로 변환 할 수 없다고하셨습니다. 이제는 (PadLeft 및 PadRight에서 가장 효율적인 구현이라면) 확실하다고 생각합니다. 그렇다면 예상대로 작동하지 않는 것은 무엇입니까? 확실하게 "port_DataReceived"메소드가 호출 되었습니까? 아무것도 textBox1에 나타 납니까? –
텍스트 상자에 장치의 응답을 받았습니다. 이 생각은 ok입니다. 응답은 길이가 13 인 16 진수입니다. 16 진수의 각 바이트에서 각 바이트를 확인하고 비트가 설정된 경우 다른 텍스트 상자 ok 메시지를 표시하거나 비트가 설정되지 않은 경우 오류를 표시하려고합니다. – gheo
퍼디난드는 이미 개별 비트를 확인할 수있는 방법을 설명했다. 아마 그것은 충분히 명확하지 않았다.
그래서 모든 바이트의 모든 비트를 확인하는 점검이 같은 흰색 코드 :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 번째 비트는 실제로 바이트에서 마지막으로 왔을 수 있습니다.
귀하의 도움에 많은 감사드립니다. 나는 당신의 설명을 이해하고 가능한 한 빨리 그것을 할 수 있기를 바랍니다. – gheo
나는 그것을 잘 만들 수 있습니다, finnaly. 도와 주셔서 감사합니다 Oleksandr – gheo
내가 말한 것처럼 그 probleme을 해결하지만 나는 장치에서 데이터를 읽을 때 다른 것을 가지고 있다는 것을 깨달았습니다. 나는 같은 시간에 모든 바이트를받지 못했습니다. 올렉산드르가 왜 그런지 아십니까? 내가 만든 버퍼가 올바로 작동하지 않는다고 생각하지만 왜 그럴까요? – gheo
비트 연산자를 살펴 보았습니까? ('<<' , '>>','&'etc.) – elyashiv
정말로 - 당신은 무엇을 시도 했습니까? –
응답을 버퍼에 저장하고 16 진수에서 2 진수로 변환하려고했습니다. 나는이 버퍼를 각 비트마다 검사했지만 원하는 메시지를 표시 할 수 없었다. (예 : 3 번째 비트가 1이면 직렬 통신이 괜찮은 경우). – gheo