Skip to content

기글하드웨어기글하드웨어

인터넷 / 소프트웨어 : 윈도우즈, 리눅스, 기타 운영체제, 각종 어플리케이션, 프로그램, 소프트웨어, 인터넷, 인터넷 서비스에 대한 이야기, 소식, 테스트, 정보를 올리는 게시판입니다.

Extra Form

 

음... 이걸 명시적 코딩이라고 하던가요?

 

코드를 누가 봐도 좀만 분석하면 척하고 아 이건 무슨 목적으로 만들었구나~ 하는걸 알 수 있도록 하는것요.

 

이를 위해서는 코드를 되도록 간결하고 불필요한 부분을 적게 만들 필요가 있다고 하죠

 

저희 팀장님은 이러한 명시적 코딩의 일환으로, 한개의 파일(*.c)에 한개의 함수만을 위치시킨다는 신념을 갖고 계시죠. (실제로 참조만 잘 걸어주면 찾기가 쉽기도 하구요)

 

 

아직 그 단계까지는 못해서 아두이노나 깔짝이면서 배워나가는 단계이긴 합니다만...

 

 

아래의 링크에 있는 코드를 한번 봐주세요.

 

https://pastebin.com/5dYDuUse

 

 

이건 예전에 졸업과제 할때 썼던 Nextion디스플레이라는걸 사용하는 코드입니다.

 

졸업과제 당시와는 달리, Nextion 디스플레이의 라이브러리에 의존하지 않고, 에디터를 통해 특정 버튼을 누르면 시리얼통신으로 제가 정한 양식의 신호를 쏘도록만 설정한 뒤, 이걸 아두이노의 하드웨어 시리얼포트로 받아서 인식하는 코드죠.

 

그래서 우선, 0x39 0x52를 연속하여 수신하는걸 시작 트리거로, 0xFF를 연속으로 세번 받으면 종료 트리거를 의미한답시고 만든게 위 링크의 SerialInputSignalSwitchONOFF 라는 이름의 함수입니다.

 

Nextion 디스플레이의 라이브러리에 정의된 시리얼 통신을 통한 전송 바이트 수는 최대 8바이트였던지라, 일단 버퍼 배열의 사이즈를 7로 설정(0~7이므로 총 8바이트, 단 아두이노 시리얼통신의 반환은 int로 이루어지므로 int로 설정하였으므로 실제로는 2바이트)

 

그리고 7개의 배열에 시리얼통신으로 받아들이는 데이터를 차례로 기록한 뒤 특정한 배열(여기서는 앞의 두 바이트가 0x39 0x52이고, 뒤에는 0xFF 연속 세 바이트가 등장)이 만족되면 특정 핀을 ON/OFF 하는 식으로요.

 

일단 동작 자체는 구현에 성공했지만, 제가보기엔 이 코드가 위의 의도를 정확히 전달할 수 없는것같아보입니다.

 

우선 시리얼로 들어오는 데이터의 버퍼가 연속으로 0x39 0x52일 때, 이것을 어떠한 이벤트의 트리거로 삼는다 라는 의미도 충족하지 못하는것같고, 0xFF가 연속 세번 들어오는것을 신호의 끝으로 본다는 의미도 전혀 전달이 안되는것같습니다.

 

 

그리고 SerialRecordArray 함수쪽은... 그냥 뭔가 이상합니다.

 

함수의 시작부분에 if(Serial.available)을 사용해서, 시리얼통신으로 수신된 데이터가 있을 경우에만(Serial.available로 수신된 데이터가 있으면 양수를 반환하는 성질을 사용하여 if문의 트리거로 사용) 별도의 버퍼에 기록하는것을 허가하는 식으로 시작하는데, 이후 for문 안에 다시한번 if(available)을 걸어주지 않으면 수신이 끝난 다음, Serial.read가 아무것도 없다고 0xFFFF(-1)를 반환해버려서 남는 자리가 -1로 싹 채워져버립니다.

 

이걸 막기위해서 for문 안에 다시금 if(available)을 걸어주는데, 이것또 앞서 말한 "명시적이지 못한" 코드같습니다. 단적으로 깔끔하지가 않다는거죠.

 

사실 제가 생각하는 가장 이상적인 통신방법은 시리얼통신으로 데이터가 들어올 때 마다 충분히 긴 버퍼에 한칸씩 밀어내며 기록을 하고, 이 배열이 위치에 상관없이, -예를들어, 16바이트의 버퍼가 있을 때 다른 시리얼통신을 통해 들어온 데이터가 [2~7]에 존재하든, [6~11]에 존재하든 상관없이, 특정한 시작과 끝바이트만을 만족하면 해당 구간을 읽어내어 거기에 맞는 명령을 실행하고 그부분은 0으로 초기화하는 식으로 구현하는게 가장 이상적이라 생각하고 어떻게든 머리를 쥐어짜내 만들었지만 이러한 의도는 전혀 반영되어 있지 않은 것 같네요...

 

그러니 부디, 선배님들의 입장에서 문제점을 좀 짚어주시길 부탁드립니다 (_ _)꾸벅

 

 



  • ?
    꿀먹은물고기 2023.07.30 13:06
    일단. 마지막 말씀하신대로 구현해도 되지만
    데이터 길이가 길 때에는 메모리 낭비로 임베디드에서는 개인적으로 추천하지 않고
    플레그나 카운트 변수, 혹은 둘 다로 시작지점과 끝지점을 판단하는방식이 좋다고 보고

    절대적으로 아무리 아두이노라지만 통신코드가 루프로 돌아가는건 바람직하지않습니다.

    시리얼 데이터등의 통신 받아오는 방식은 인터럽트를 적극 활용해주시는베 시스템 반응 및 부하관리에 좋습니다
  • ?
    노예MS호 2023.07.31 00:51
    아예 인터럽트로 따로 뺀 뒤, 인터럽트 조건을 if(Serial.available())로 하는식으로 해야한다는 말씀이시군요
  • ?
    김경철 2023.07.30 16:01
    일단 array size를 7로 하면 index는 0~6까지입니다. SerialRecordArray 함수내의 두 루프는 어레이 크기를 1개 초과할때까지 돌아가게 되어 있어 위험합니다.

    명시적으로 이런 통신내용을 처리하려면 각 패킷 타입을 하나의 structure로 만들고, 전체 패킷은 각 패캣 struct의 union 형태로 만드는것이 정석입니다.
    즉 맨 앞 두바이트 0x39 0x52는 일종의magic number로 패킷 내용에는 절대 등장하지 않는 내용이라 가정하고,
    모든 패킷의 크기와 형태가 정해져 있다면, 두바이트 매직넘버 받고나서 type받고, 해당 타입에 따라 정해진 크기만큼 받는 식으로 해서 주어진 union of struct를 채워나가는 형태로 구성해야 합니다.
    유닉스/리눅스의 기본 GUI인 X window쪽 헤더파일 Xproto.h 같은거 보시면 잘 나옵니다.

    그리고 그 받는 내용은 circular queue(ring buffer라고 부르기도 합니다)를 구성하여 혹시나 처리에 시간이 많이 걸리더라도 들어오는것을 큐에 쭈욱 쌓아놓고, 한번에 처리하고 등등... 자료구조 책 보시면 나옵니다.

    그런데, 시리얼 통해서 간단한 장치 연결할때는 이런 패킷/프로토콜 헤더파일을 만드는게 귀찮으니 그냥 글쓰신분 하듯 만드는 경우도 종종 있습니다.
  • ?
    노예MS호 2023.07.31 00:53
    아예 이런 통신쪽 관련한 서적도 있군요? 그걸 한번 찾아보겠습니다.
  • profile
    레드팍스 2023.07.30 17:18
    몇 군데에서 이런 코드가 보이네요.
    //memset(buf, 0, sizeof(buf)*bufsize);
    buf[bufsize] = {0};
    buf 배열을 초기화를 하기 위해, memset() 함수를 사용하는 대신 buf[bufsize] 에 값을 대입하는 것으로 보입니다. 그런데 이 코드가 빌드가 되나요?

    제가 보기에는 6라인의 "int buf[bufsize] = {0}; // buffer initialization" 와 같은 역할을 할 것이라고 기대하신 것 같은데, 문법은 거의 같지만 선언 부분과 실행 부분에서의 동작은 완전히 다릅니다.
    배열 선언시의 int buf[bufsize] = {0}; 은 bufsize 만큼의 integer 배열을 선언하며 0 으로 초기화하지만,
    실행 부분에서는 buf[bufsize] = xxx; 는 xxx 를 buf 배열의 bufsize + 1 번째 요소에 값을 대입하는 코드입니다.

    사족이지만 주석처리 되어있는 memset(buf, 0, sizeof(buf)*bufsize) 도 잘못된 코드입니다.
    16비트 환경에서 buf 배열은 2 * 7 = 14 bytes 만큼 할당되었는데
    위의 memset() 은 14(sizeof(buf)) * 7(bufsize) = 98 bytes 만큼 0 으로 덮어쓰게 됩니다.
  • ?
    노예MS호 2023.07.31 00:50
    어쩐지 잘 초기화가 안된다 싶었습니다. memset 함수에 대해 좀 더 면밀히 알아봐야겠네요
  • ?
    dmy01 2023.07.31 13:42
    코딩룰 함 해보시면 원하는 답을 얻을 수 있습니다
  • ?
    노예MS호 2023.07.31 16:13
    그거 회사에서 미스라C라는걸로 깔짝대고 있는데도 이모양이라죠...
  • ?
    anonymous1 2023.07.31 23:22
    문법이나 아두이노 라이브러리 사용법같은건 자료를 이것저것 찾아보고 공부하시면 되고,

    의도를 나타내는건 쉽습니다. 이름변경+ 함수로 분리를 하시면 됩니다.
    클린코드, 쏙쏙 들어오는 함수형 코딩, 같은 책들을 보면 자세히 나와있습니다.

    예를들면 그냥 Serial1을 그냥 쓰는데
    HardwareSerial & MonitorSerial = Serial1; 를 추가하고
    Serial1.available같은걸 MonitorSerial.available()로 바꾸면 코드가 분명해집니다.

    if ( (buf[0] == 0x39) && (buf[1] == 0x52) ... 를 그냥 쓰지말고
    if (FindHeader() && FindFooter()) 로 바꾸면 이게 뭘 하고 싶은 코드인지 의도를 알 수 있습니다.
    bool FindHeader(){
    return (buf[0] == 0x39) && (buf[1] == 0x52);
    }
    bool FindFooter(){
    return (buf[3] == 0xFF) && (buf[4] == 0xFF) && (buf[5] == 0xFF);
    }

    LED_BUILTIN, LED1 같은 이름이 아니라 LED_RX, LED_INDICATOR 같이 변수명 매크로 하나하나가 실제 나타내는 의미로 이름을 작성해야 합니다.

작성된지 4주일이 지난 글에는 새 코멘트를 달 수 없습니다.


  1. No Image

    체리트레일 윈8.1

    대충 들고다니는 용도로 쓰는 체리트레일 아톰 x5-z8350에 2기가 램 달린 아이뮤즈 스톰북13 노트북이 있습니다. 윈10 21h2 깔린걸 재설치하긴 귀찮아서 적당히 (많이) 경량화해 쓰다 잘못 꼬였는지 오류를 자주 뱉고 탐색기가 이상해져 ...
    Date2023.09.08 질문 By헥사곤윈 Reply23 Views989
    Read More
  2. No Image

    마이크로소프트 저널 앱에서 pdf 내용 인식할 방법이 있을까요..?

    원노트 앱은 불러온 pdf의 내용 검색이 가능한데 내용 불러오는 속도랑 필기 제스처 안되는게 불편하고   저널 앱은 원노트의 불편한점들이 해결되어있어 마음에 들었는데 불러온 pdf 속의 내용을 검색 못하는 치명적인 문제가 있네요... ...
    Date2023.09.07 질문 Byacropora Reply0 Views480
    Read More
  3. 유튜브 버퍼링바? 이거에 대해 잘아시는분 계신가요?

      전 유튜브를 무조건 노트북이나 컴퓨터로 봅니다.   그리고 외국이나 국내의 영상길이가 긴 40~50분 1시간 넘어가는 영상들은 10초넘기기 5초넘기기하면서 보는데요   저 하얀색 버퍼링바는 오프라인저장하는 방식말고는 영상시작부터 ...
    Date2023.09.06 질문 By99rising Reply3 Views875 file
    Read More
  4. mactype 적용 후 : 문자가 깨집니다

    https://gigglehd.com/gg/soft/12183718   빙그레님 글 참조해서 이전에도 서피스 랩탑 스튜디오에 mactype 적용해서 잘 사용했었는데   이번에 서피스 프로에 적용하니 다른데는 문제없는데 :만 목록 표시처럼 바가 쌓인 문자로 변했습니...
    Date2023.09.04 질문 Byacropora Reply5 Views706 file
    Read More
  5. No Image

    N95 miniPC로 NAS구성 질문

    이전 알리에서 충동구매한 Beelink사 N95 미니 PC로 NAS 구성하려고 합니다   용도는 간단 파일저장과 홈네트워크에 있는 삼성스마트 TV 영상 연결정도 예정입니다   이전에는 라즈베리 파이4에 외장SSD를 USB3.0으로 물리고 Nextcloud 를...
    Date2023.09.04 질문 Bytitle: 오타쿠야고 Reply10 Views1294
    Read More
  6. No Image

    웹 사이트가 죽으면 휴대폰으로 알림 오게 하는 방법 있나요?

    인터넷 웹 사이트를 만들었는데 간헐적으로 서버가 죽네요. 그래서 서버가 죽을 때 마다(웹 사이트에 접속이 불가능 해 질 때 마다) 휴대폰으로 알람이 왔으면 좋겠는데, 괜찮은 방법 없을까요?   
    Date2023.09.02 질문 By부녀자 Reply10 Views953
    Read More
  7. No Image

    괜찮은 webm to mp4 프로그램 없을까용?

    으흠....   사실 webm muxer를 찾고있는건데요   megui muxer가 안되는거보고   그냥 mp4로 바꿔서 쓰고 있습니다........       바꿀때 마다 그냥 웹 검색해서 나오는 사이트에서 바꾸고 있는데   업로드에 잡아먹는 시간이 번거롭네용  ...
    Date2023.09.01 질문 By포도맛계란 Reply18 Views517
    Read More
  8. No Image

    애플 프라이빗 릴레이로 트위치 vod 시청 가능한가요?

      해외 스트리머의 vod를 보고싶은데 한국에서는 vod 서비스가 안되서 VPN을 써야한다고 하는데, 혹시 프라이빗 릴레이로 vod 시청이 가능한가요?
    Date2023.08.27 질문 Bytitle: 몰?루먀먀먀 Reply2 Views762
    Read More
  9. 회사용 브라우저가 생깁니다.

      어제까지는 없었는데 오늘 보니,  뜬금 없이 회사용 브라우저가 생겼습니다.   해당 PC는 일부 작업에서만 회사 아이디로 로그인 해서 M365를 사용하는 정도입니다.   갑자기 저렇게 뜨는 Icon이 생성되는 데다, 회사 계정 로그인하라...
    Date2023.08.25 질문 Bytitle: 가난한AKG-3 Reply10 Views1348 file
    Read More
  10. No Image

    세로로 쭉~ 긴 이미지는 어떻게 캡쳐하는건가요?

    https://gigglehd.com/gg/bbs/14729412   제가 오늘 올린 글인데 옛날부터 정말 궁금했던게 있습니다 본문 이미지 눌러보시면 알겠지만 저렇게 '아래로 쭈욱 길게 캡쳐'하는 방법이 뭔지 아시나요... 해당 글의 오리지널 출처는 더쿠라는 ...
    Date2023.08.17 질문 By무식한공병 Reply20 Views1167
    Read More
  11. No Image

    LG인터넷 쓰시는분 계신가요?

    KT인터넷 500M짜리 3년쓰고 약정끝나서 바꿀려는데   LG인터넷이 젤 싸고 사은품도 많아서 고민이네요..   KT만 써봐서 다른통신사 안정성같은게 궁금하기도하고요   롤하다가 갑자기 핑 올라가고 이러면 스트레스 엄청받을거같은데   쓰...
    Date2023.08.17 질문 By99rising Reply16 Views1732
    Read More
  12. tensorflow 사물 인식 관련 인식율 상향 방법 문의

    안녕하세요   탱크 색적기를 만들고 있는데, 이게 생각보다 잘안되네요         이런 애들은 당연히 잘되고     요런 애들까지도 잘되는데       이런애들은 감지가 안되는 ...ㅠ   map 점수가 54점 정도인데, 이정도면 상품성이 없겠죠.....
    Date2023.08.15 질문 Bybabozone Reply16 Views904 file
    Read More
  13. No Image

    유튜브 채널 차단하는 방법 없나요?

    신고 거리는 안 되는데, 그냥 보기 싫은 유튜브 채널 차단하는 방법은 없을까요?   아무리 찾아봐도 유튜브 채널 차단하는 방법이 안 나오네요. 예전 방법으로 하면 '채널 차단'과 같은 항목이 없어요.   확장 프로그램 써서 PC에서 차단...
    Date2023.08.03 질문 By헬로월드 Reply9 Views1877
    Read More
  14. No Image

    요즘 동영상 플레이어 뭐 쓰시나요.,?

    잘쓰던 KMP가 다시 10년전으로 롤백한듯한 광고 덕지덕지 붙였더라고요.   vlc 플레이어 있긴한데. 카카오/ kmp만 쓰다가 쓸려고 하니 뭐가 뭔지 잘 모르겠네요..   다른거 적당한거 있는지 궁금합니다..   유료여도 상관없습니다. 
    Date2023.07.30 질문 Bytitle: 명사수AZUSA Reply18 Views1066
    Read More
  15. No Image

    임베디드 개발자분들께 질문있습니다

      음... 이걸 명시적 코딩이라고 하던가요?   코드를 누가 봐도 좀만 분석하면 척하고 아 이건 무슨 목적으로 만들었구나~ 하는걸 알 수 있도록 하는것요.   이를 위해서는 코드를 되도록 간결하고 불필요한 부분을 적게 만들 필요가 있다...
    Date2023.07.30 질문 By노예MS호 Reply9 Views828
    Read More
  16. No Image

    윈도우11 캡처도구 저장 단축키가 작동하지 않습니다

    윈도우10까지만 하더라도 ctrl+s를 입력하면 자동으로 저장 창이 뜨는데, 윈도우11부터는 수동으로 저장 버튼을 클릭해야 저장 창이 나타납니다.   구글링해도 자동저장과 같은 기능 설명만 있는데 정작 필요한 정보는 안 나오네요..
    Date2023.07.28 질문 ByArcade Reply4 Views511
    Read More
  17. No Image

    윈도우 11에서 끝 단어 짤리는 문제 해결 방법이 궁금합니

        제목과 같이 잘려버리는데 메일을 보낼 때도 오타가 잦아서 여간 불편한 것이 아닙니다.   윈도우10에서는 겪어보지 못 한 문제인데 해결 방법이 있을까요?  
    Date2023.07.26 질문 ByArcade Reply5 Views704
    Read More
  18. 메모리 테스트하는 프로그램이 다른게 있을까요?

    https://gigglehd.com/gg/bbs/14608211 대충 메모리 구매해서 메모리 테스트한다는 글입니다.     그런데 윈도우 메모리 진단 도구를 한 3일 정도 켜놨는데 이 화면에서 달라지지 않습니다. 열받아서 그냥 종료시켰어요. 이벤트 로그에 아...
    Date2023.07.26 질문 ByExpBox Reply3 Views587 file
    Read More
  19. 윈도우 드라이브 공유를 하려고 하는데 공유 버튼이 활성화가 안됩니다.

      외장SSD 전체를 다른 컴퓨터에서도 열 수 있게 공유하려고 했는데 공유 버튼 자체가 안 눌리게 되어있습니다. 웃긴 건 C 드라이브 폴더들은 다 눌리고 설정도 되고 심지어 저 SSD 안의 폴더도 공유 버튼이 눌리고 실제로 되는데 드라이...
    Date2023.07.23 질문 Bytitle: 민트초코고토_히토리 Reply7 Views596 file
    Read More
  20. 램 용량이 남아도 크롬 메모리 부족 창이 뜹니다

            특히 유튜브에서 해당 문제가 발생되는데 혹 해결책이 있을지 문의드립니다.      
    Date2023.07.20 질문 ByArcade Reply14 Views1705 file
    Read More
목록
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 73 Next
/ 73

더함
MSI 코리아
한미마이크로닉스
AMD

공지사항        사이트 약관        개인정보취급방침       신고와 건의


기글하드웨어는 2006년 6월 28일에 개설된 컴퓨터, 하드웨어, 모바일, 스마트폰, 게임, 소프트웨어, 디지털 카메라 관련 뉴스와 정보, 사용기를 공유하는 커뮤니티 사이트입니다.
개인 정보 보호, 개인 및 단체의 권리 침해, 사이트 운영, 관리, 제휴와 광고 관련 문의는 이메일로 보내주세요. 관리자 이메일

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소