RS-485 통신이 제대로 안되는 문제...

nexus0420의 이미지

안녕하세요 여기 포럼에 가입하고 처음 글 써봅니다! 잘 부탁 드립니다!!

ARM 보드 임베디드 프로그램 짜던 중에 RS-485 통신 관련해서 문제가 있어서 질문 드립니다.
코드 전체는 파일로 첨부합니다.

동작은 프로그램이 실행 되면 ARM 보드 GPIO로 제어되는 RS-485로 데이터를 보내고
데이터를 다 보내면 GPIO 출력을 OFF 시켜 데이터를 받는 상태로
1초, 1초 총 사이클이 2초정도 걸리게 하게끔 만드는 프로그램으로 작성 중입니다.

개발 환경은
IDE는 QT 쓰고 크로스 컴파일 해서 컴파일 된 실행 파일을 ARM 보드(Yocto)에 넣어서 테스트 하고 있습니다.

fd=open("/dev/ttyS1", O_RDWR | O_NOCTTY );
if(fd < 0)
{
printf("connection fail \n");
return 0;
}

struct termios newtio;
memset(&newtio, 0, sizeof(struct termios));
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_oflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;

tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
while(1)
{
setPinValue(GPIO3_21, ON);
char *str = "test\n";
write(fd ,str, strlen(str)+1);
sleep(1);

if(0>write(fd, str, strlen(str)))
{
setPinValue(GPIO3_21, OFF);
res = read(fd,dta,255);
printf("%s:%d\n", dta, res);
sleep(1);
}
}
close(fd);

이게 제가 짠 코드 중에서 시리얼 통신 포트 설정, Read, Write 부분입니다.

저거대로 실행했더니...

일반 받는 쪽(PC)에서는 데이터는 가지만
그 데이터 값이 코드상에서 무슨 값을 보내게 되있더라도 무조건 공백이 나옵니다

보내는쪽에서는 공백만 보내는게 가능하고 PC쪽에서 보내는 신호는 전혀 표시를 못하고 있습니다.
보낼때도 심지어 PC쪽에서 받는 RTX 부분은 주기적으로 깜박거리는데
받은 데이터를 표시하는거는 심하면 1분에 1개 정도로 불규칙적으로 나오고 있어요...

도대체 뭐가 문제인건지 정말 몇주동안 생각하고 헤매다가 이제서야 질문 드립니다 ㅠ

제가 데이터를 보내고 쓰는 과정에 sleep 시간을 잘못 써서 그런걸까요?
도저히 몇일동안 하루종일 저거 걱정만 해도 해결이 안됩니다...

좀 제발 정상적인 데이터를 받고 싶은데

보내고 받아지는거는 공백, 아니면 이상한 한글 깨진 문자, hex값으로는0xCE, 0xF0 이런 전혀 상관없는 값만 보냈다고 표시가 되네요

제발 방법이 없을까요 ㅠ

분명히 GPIO 출력도 제대로 나오는거 직접 테스트기에 찍어보면서까지 확인했습니다

File attachments: 
첨부파일 크기
Package icon main.zip1.23 KB
라스코니의 이미지

GPIO 출력이 정상이라면 RS485 라인도 오실로스코프 등으로 정확한 파형이 나오는지 확인하셨나요?

RS-485 라인에서 정확한 데이터 파형이 나온다면 수신측에 baud rate 설정이 9600인지 확인해 보세요.

왜 write(fd, str, strlen(str)+1)를 두번 호출하셨는지 모르겠네요.

제일 먼저 RS485 출력 라인에서 데이터가 뜨는지 오실로스코프로 확인하셔야 합니다.

nexus0420의 이미지

pc에서는 uport 1150 장비를 usb로 연결해서 썼습니다.
그 장비 상에서는 pc쪽이 정상적으로 데이터를 받고있다고 rtx에 점등은 되지만

정작 pc화면 상에서는 데이터가 불규칙적으로 오면서 데이터도 정상적으로 값이 안나오더라구요

write를 두번 쓴거는 사실 데이터를 다 보내고 보낸 데이터 상태가 0이 됐을때

gpio를 끄고 데이터를 받는 상태로 하기 위해서 if문 때문에 그렇습니다

라스코니의 이미지

pc에서 못받는 상황이라면 2가지 가능성이 있죠.
1) pc RS485 계통 하드웨어 고장
2) RS485 드라이버 설정 오류 (port number, baud rate 등)

윈도우라면 여러 무료 uart 소프트웨어(Hercules 등 https://www.hw-group.com/software/hercules-setup-utility)를 쓸 수 있는데,,,

리눅스를 쓰시는 것 같으니 비슷한 종류를 찾아서 우선 하드웨어 문제가 아닌지를 확인해 보시고, 하드웨어 문제가 없다면 단순 드라이버 초기화 문제입니다. 몇가지 설정을 바꿔가면서 체크하시면 되요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.