2012-09-28 5 views
0

는 I는 장치 포트에 16 진수 코드를 쓰기 C# 코드가 C#으로 설정되어 있는지 확인하는 방법. 장치가 포트에 응답하고, 그의 대답을 읽고, 그것을 16 진수로 변환하고 텍스트 상자에 표시합니다. 이제 답변에서 각 비트를 확인하고 텍스트 상자에 메시지를 표시하거나 그와 같은 메시지를 표시해야합니다.버퍼 내의 특정 비트가

아무도 도와 줄 수 있습니까?

미리 감사드립니다.

+1

비트 연산자를 살펴 보았습니까? ('<<' , '>>','&'etc.) – elyashiv

+2

정말로 - 당신은 무엇을 시도 했습니까? –

+0

응답을 버퍼에 저장하고 16 진수에서 2 진수로 변환하려고했습니다. 나는이 버퍼를 각 비트마다 검사했지만 원하는 메시지를 표시 할 수 없었다. (예 : 3 번째 비트가 1이면 직렬 통신이 괜찮은 경우). – gheo

답변

2

비트 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"); 
+0

도움을 주신 Ferdinand에게 많은 감사를드립니다. 그러나 System.Windows.MessageBox.Show는 도움이되지 않습니다. 나는 특정 텍스트 상자에 내 GUI에서 "5 개 비트가 설정" "보여주고 싶은 – gheo

+0

myTextBox.Text ="5가 설정됩니다 ";... –

+0

답 페르디난드 주셔서 대단히 ok.thank – gheo

1

- 모든 단일 비트를 개별적으로 검사하는 것보다 훨씬 간단하고 효율적입니다. 이 방법은 원하는대로 이진 및 HEX 형식으로 변환 할 수 있습니다.

+0

이진 표현이 필요 없어, 각 바이트에서 각 비트를 확인해야합니다. 장치에서 내 대답은 16 진수 형식으로 13 바이트, 그래서 내가 104 비트를 확인해야합니다. 나는이 작업을 수행해야 – gheo

+0

는 생각 : 1. 첫째로 나는 X 바이트가 설정되어있는 경우 등, 두 번째 또는 세 번째 물린 (확인 여부를 확인 설정되어있는 경우 나 디스플레이를 텍스트 상자에 하나의 메시지를 원하는 모든 물린 2.Secondly을 선택해야합니다 한 번 정수를 확인합니다 경우 1 "직렬 COMUNICATION 확인, 다른 직렬 통신 에러 등") – gheo

+0

가 그럼 난 페르디난드의 추천에 동의합니다.하지만 함께 "> 0"을 대체하는 것이 좋습니다! "= 0".이 때문에, 당신은 할 수 GE t 음의 값. –

0
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(); 

     } 
     )); 


    } 
+0

이것은 내 C# 코드이며 여전히 문제가 있습니다. 누구든지 나를 도와 줄 수 있습니까? – gheo

+0

새로운 문제를 설명해 주시겠습니까?첫 번째 게시물에서 바이너리를 문자열로 변환 할 수 없다고하셨습니다. 이제는 (PadLeft 및 PadRight에서 가장 효율적인 구현이라면) 확실하다고 생각합니다. 그렇다면 예상대로 작동하지 않는 것은 무엇입니까? 확실하게 "port_DataReceived"메소드가 호출 되었습니까? 아무것도 textBox1에 나타 납니까? –

+0

텍스트 상자에 장치의 응답을 받았습니다. 이 생각은 ok입니다. 응답은 길이가 13 인 16 진수입니다. 16 진수의 각 바이트에서 각 바이트를 확인하고 비트가 설정된 경우 다른 텍스트 상자 ok 메시지를 표시하거나 비트가 설정되지 않은 경우 오류를 표시하려고합니다. – gheo

0

퍼디난드는 이미 개별 비트를 확인할 수있는 방법을 설명했다. 아마 그것은 충분히 명확하지 않았다.

그래서 모든 바이트의 모든 비트를 확인하는 점검이 같은 흰색 코드 :

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 번째 비트는 실제로 바이트에서 마지막으로 왔을 수 있습니다.

+0

귀하의 도움에 많은 감사드립니다. 나는 당신의 설명을 이해하고 가능한 한 빨리 그것을 할 수 있기를 바랍니다. – gheo

+0

나는 그것을 잘 만들 수 있습니다, finnaly. 도와 주셔서 감사합니다 Oleksandr – gheo

+0

내가 말한 것처럼 그 probleme을 해결하지만 나는 장치에서 데이터를 읽을 때 다른 것을 가지고 있다는 것을 깨달았습니다. 나는 같은 시간에 모든 바이트를받지 못했습니다. 올렉산드르가 ​​왜 그런지 아십니까? 내가 만든 버퍼가 올바로 작동하지 않는다고 생각하지만 왜 그럴까요? – gheo

관련 문제