시리얼통신 관련 질문드립니다.

안녕하세요. 시리얼 통신을 하는데 문제가 있어 질문드립니다.

cas 인디케이터와 연결을 할려고 합니다. cas 인디케이터는 스트림모드인데 다른 시리얼프로그램을 통해 테스트를 하

면 데이터가 정상적으로 들어옵니다.

그런데 .net으로 프로그램을 만들어 통신을 하면 포트는 연결이 되는데 데이터가 들어오질 않습니다.

만든 프로그램이 이상한가 싶어 다른 시리얼프로그램과 연동해서 TEST를 하면 프로그램으로 데이터가 잘 들어옵니다.

지금 이틀째 고민중인데 도통이유를 모르겠습니다. 인디케이터로부터만 넘어오는 데이터를 수신을 하지 못하는데

리시브이벤트 핸들러가 전혀 작동을 안하는거 같습니다.

이유가 무엇일까요?? 이런 경우는 첨인데 도움부탁드립니다. 아래는 통신 포트 연결 소스입니다.

try {
sp = new SerialPort(“COM7” , 9600 , Parity.None ,8 ,StopBits.One);
sp.Open();

        sp.DataReceived += (sender, e) =>
        {

            blankLabel(1);

            byte[] weightbytes = new byte[sp.BytesToRead];

            sp.Read(weightbytes , 0 , sp.BytesToRead);

           // MessageBox.Show(sp.BytesToRead.ToString());

            foreach (byte weightbyte in weightbytes)
            {
                weightData.Add(weightbyte);

               if (weightData.Count >=2)
                {
                    if (weightData[weightData.Count - 2] == 0x0D && weightData[weightData.Count - 1] == 0x0A)
                    {
                        byte[] weightBytes = weightData.ToArray();
                        byte[] weightDataBytes = new byte[9];

                        weightDataBytes[0] = weightBytes[9];
                        weightDataBytes[1] = weightBytes[10];
                        weightDataBytes[2] = weightBytes[11];
                        weightDataBytes[3] = weightBytes[12];
                        weightDataBytes[4] = weightBytes[13];
                        weightDataBytes[5] = weightBytes[14];
                        weightDataBytes[6] = weightBytes[15];
                        weightDataBytes[7] = weightBytes[16];
                        weightDataBytes[8] = weightBytes[17];



                        displayWeight(weightDataBytes);
                        weightData.Clear();
                    }
                }
            }

            blankLabel(0);
   
        };
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
1개의 좋아요

DateReceived 델리게이트 안에서 UI 에 뭔가를 출력해주는거 같은데
Invoke 또는 BeginInvoke 사용해야하지 않을까요?

1개의 좋아요

invoke 적용해서 수신값이 전부 보이도록 해뒀습니다. 다른 프로그램을 혹은 시리얼로 들어오는건 전부 데이터가 보이는데 인디케이터만 수신이 안되니 답답하네요 ㅠ

1개의 좋아요

DataReceived 핸들러 자체가 호출이 안 되나요?
그렇다면 뭔가 설정이 잘못되어 데이터 수신이 안 되고 있다고 봐야할 거 같슴다.

핸들러 호출이 발생했다면 저는 sp.Read() 가 약간 의심이 되는데
디버깅 용도로 var indata = sp.ReadExisting(); 같은 걸로 데이터를 확인해 보면 어떨까 싶네요.

시리얼은 환경 영향을 많이 받는 부분이라 뭔가 잘 안 된다 싶으면
설정부터 하드웨어 상황까지 일일이 디버깅해봐야 해서 쉽지 않은 분야이기도 해욜

2개의 좋아요

blankLabel 호출하는 부분에서 Break point를 설정해놓고
데이터 수신 이벤트가 발생하는지부터 확인하시는게 좋을거 같습니다.

1개의 좋아요

DataReceived 이벤트 말고 바로 Read를 해서 원하시는 값이 반환되는 것 먼저 확인이 필요할 듯 합니다. 공유 주신 내용만으로는 문제를 특정하기가 어려운 것 같아요.

1개의 좋아요

RtsEnable 같은 통신 옵션이 문제일 수 있습니다~

4개의 좋아요

와 맞습니다. Rts , Dtr 옵션을 활성화 시키니 잘되더라고요~! 감사합니다!!

1개의 좋아요

시리얼 통신 옵션 문제였네요~ 감사합니다!

1개의 좋아요

네 이벤트핸들러 자체가 호출이 안되더라고요~ 근데 어제 해결봤습니다. 통신옵션이 문제였네요~! 감사합니다.

1개의 좋아요

코드 한줄 한줄 전부다 메세지박스 달아서 TEST 해봤는데 리시브이벤트가 호출이 안되더라고요~! 근데 어제 해결했습니다. 통신옵션 문제였네요~! 감사합니다.

3개의 좋아요

결과적으로 어떤 문제였는지 공유까지 해주시니 제가 더 감사합니다 :+1:
여기 계신 분들이 호기심이 많으셔서 다들 궁금하셨을 거에요 :grin:
문제 해결하셨다니 다행입니다!

2개의 좋아요