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

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

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