c# SerialPort 에 관련한 질문입니다.

안녕하세요 C# 으로 기계쪽 통신을 주로 하는 개발자 입니다.

이번에 처음 겪는 케이스라 질문 올립니다.

패키지 프로그램으로서 C# 으로 만들어 시리얼 통신을 하는 부분을 몇년간 잘 사용하고 있었는데. 이번에 새로운 기기 통신을 해야해서 시리얼 테스트를 했습니다.

먼저 기본으로 ppa 프로그램을 활용해서 통신이 성공하였습니다.

통신 설정은 1200, 7, 홀수, 1, rts/cts 로 하여 정상 작동을 확인 하였습니다.

그리고 c# 으로 만든 통신 프로그램으로 통신을 하는데 전혀 작동을 안합니다

보통은 데이터 들어오면 datareceived 이벤트에 진입이라도 하는데 아예 진입 조차 안합니다. 좀 이상해서 직접 시리얼 통신 프로그램 로직을 만들었는데 역시나

이벤트로 진입조차 안합니다. 그래서 인터넷에 다른 c# 시리얼 통신 프로그램을 받아서 해봤는데 모두 마찬가지 입니다.

기기에서 보내기 버튼을 여러번 누르면 반응조차 안하다가 다른 언어 (c 언어)로 된 테스트 프로그램으로 연결하면 전에 눌렀던 데이터가 연결 하자마자 들어옵니다.

c# 으로 만들어 진거랑만 통신이 안됩니다.

처음 보는 문제라 혹시 이런 현상을 보셨거나 해결책을 아시는 분이 계시면 부탁 드립니다.

지금 퇴근해서 소스를 볼순 없으나 대강 집에서 테스트 할때 썼던 코드를 작성하여 첨부합니다.

namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
private SerialPort SerialPort;

    private string ReceiveData = string.Empty;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SerialPort?.Dispose();

        SerialPort = new SerialPort
        {
            PortName = "COM1",
            BaudRate = 1200,
            Parity = Parity.Odd,
            DataBits = 7,
            StopBits = StopBits.One,
            Handshake = Handshake.RequestToSend,
            ReadTimeout = 2000
        };

        SerialPort.DataReceived += (s, ev) =>
        {
            ReceiveData += SerialPort.ReadLine();
        };

        if (SerialPort.IsOpen)
            SerialPort.Close();

        SerialPort.Open();
    }
}

}

보다시피 그냥 평범한 시리얼 통신 프로그램입니다.
저기서 저 리드라인에 브레이크 걸어놔도 걸리지도 않습니다.
저방법 말고 스레드로 리드 하는 방식도 해봤습니다.

다른 C# 으로 만든 테스트 프로그램은 인터넷에서 구한거라 소스는 없습니다.

요런 문제의 질문은.,

그냥 설명만으로는 알수가 없습니다.

장비 연동이기에 다른 사람이 직접 해볼 순 없지만

최소한 테스트 해보았던 코드라도 올려 주시는 것이 좋지 않을까요 ?

2 Likes

감사합니다. 대강 코드를 구성하여 올렸습니다.

1 Like

Parity 와 Handshake 등의 값을 바꾸고 해보세여…
저도 되다가 안되서 값을 바꿧더니 됐던 기억이 있습니다.

1 Like

Handshake.None 으로 해보시죠.
설정문제 같은데 그래도 안되면 putty 같은 툴로 테스트해보세요

2 Likes

핸드 쉐이크도 다 바꿔보고 해봤습니다. 그래도 신기하게 안되네요.

저도 첨 보는 거라 너무 당황스러움

다른 툴로 (C# 이 아닌 C 언어로 만든 툴) 은 다 됩니다. 근데 이상하게 C# 으로 만든 툴들은 안되요

1 Like

연결의 문제가 아닌가 합니다. 설정이 잘못되더라도 쓰레기 값이라도 들어와야 하는데요. 장비 연동의 특성 상 장비를 연결해서 확인해야 정확한 원인을 알 수 있어서 온라인 상으로는 도움을 드리기가 어렵네요.

1 Like

설명해주신 부분에서 힌트를 얻어보면 rts와 dtr을 활성화해야 하는 장비인거 같은데
올려주신 소스코드에는 rts와 dtr을 활성화 해주는 부분이 없습니다.
둘 다 기본값이 false이기 때문에

serialPort.RtsEnable = true;
serialPort.DtrEnable = true;

이렇게 활성화해주는 부분이 필요해 보입니다.

3 Likes

헐… 감사합니다. 당장 해보진 못했지만 저런게 있는건 첨알았네요 해보겠습니다!!

2 Likes

한가지 더 궁금한게 있는데요
Handshake = Handshake.RequestToSend 이옵션이랑
serialPort.RtsEnable = true; 랑은 무슨차이인가요?

그리고 serialPort.RtsEnable = true; 는 그냥 무조건 true 로 해놔도 혹시 다른 종류의 기기 연결할때 문제가 없을까요? 아니면 별도의 옵션창을 만들어서 관리하는게 나을까요?

답변 감사합니다~!!

2 Likes

저도 예전에 시리얼통신이 안된경험이 있어서 RTS , CTS 옵션을 활성화 시키니 통신이 되더라고요.
C# 시리얼 관련 프로그램 옵션 내용은 아니지만 시리얼 통신에 대한 내용이니 참고해보세요~!

https://blog.naver.com/funfree/150139766529

4 Likes

감사합니다~~~

2 Likes

핸드셰이크에도 그게 있었군요;;
저의 경우에는 핸드셰이크는 기본값이었고, rtsEnable속성 설정 후 통신이 됐던 경험이 있었습니다.
저도 몰랐던 내용이라 gpt에게 물어봤으나 정확히 이해가 안되네요. @Tokhi 님께서 올려주신 링크가 유익해보입니다!

그리고 문제 해결은 되신건지 궁금하네요.
그게 d-sub 결선과도 영향이 있는데, 모든 케이스(c,c#)에 대해 같은 케이블로 테스트하신건지도 궁금합니다!

넵. c, c# 둘다 같은 케이블로 연결했습니다.

아마 말씀하신 부분이 맞을거 같아서 두근거리네요.

다음주가 되야 확인 하러 갈 수 있지만.

맞을거 같습니다. 핸드쉐이크랑 저 옵션은 별도인거 같아요.

c 언어로 된 것들은 기본적으로 그 옵션을 다 true 로 해놨을 수 있을거 같아요

좀 찾아보니 그 옵션을 true 로 해놔도 사용하지 않는 기기에서는 알아서 무시한다고

되어있네요. 왜 기본값을 false로 해놨는지 모르겠어요

2 Likes

http://www.ktword.co.kr/test/view/view.php?nav=2&no=3128&sh=rts