초보의 아웅다웅 설계하기/비주얼 베이직 6.0

UART 데이터 받기

로망와니 2010. 12. 2. 22:00

후접한 너무도 후접한..
UART 데이터 받아 원하는 변환값으로 변환후 그래프로 그려주려고 만든 파일..
저장은 엑셀파일로....

Private Sub Command1_Click()
On Error Resume Next '에러를 무시하고 지나가라. 포트를 두번 열었을때 발생하는 에러 방지
'On Error GoTo errText
Form2.MSComm.PortOpen = True
MsgBox "포트를 열었습니다."
'Text1.Text = "포트를 열었습니다."
'Picture1.Scale (0, 3000)-(300, 0)

'Picture1.DrawWidth = 1 '선 굵기
'Picture1.Line -(10, 3000), RGB(180, 0, 0)
'Picture1.Line -(20, 2000), RGB(180, 0, 0)
'Picture1.Line -(30, 1000), RGB(180, 0, 0)
'Picture1.Line -(40, 800), RGB(180, 0, 0)

'개체명.Line ☞ 지정한 개체에 선이나 사각형을 그린다.(Line(x1,y1)-(x2,y2),[선색],B)
' (Picture1.Line (1500,500) - (5000,2000) ☞ 대각선이 그려집니다.)
' (Picture1.Line (1500,1000) - (5000,2000), , B ☞ 직사각형이 그려집니다.(B를 사용하면 사각형))
' 개체명.Circle ☞ 지정한 개체에 원이나 타원을 그린다.(Circle(x,y),반지름,[색,시작,끝,옵션]
' (Picture1.Circle (1500,1800), 900, , , , 0.7 ☞ 타원을 그립니다.(0.7은 가로,세로 비율값을 설정))
' (Picture1.Circle (1500,18000), 900 ☞ 원을 그립니다.)
'픽쳐박스.Line (x1, y1)-(x2, y2)[, DrawColor] 으로 그리면됩니다.

'Y축은 보통은 위가 0이고, 밑으로 내려갈수록 +로 됩니다.

'그걸 바꾸고 싶으면 픽쳐박스.Scale 함수를 먼저 사용하시고 Line 함수를 사용하면 됩니다.

'그리지 않고 시작 위치만 바꾸로 싶은 경우에는 CurrentX, CurrentY를 사용하시면 되고요.

'이전위치에서 어느 한위치로만 그릴경우에는 Line -(x,y) 함수를 사용하세요..

'Exit Sub '

'errText: MsgBox "포트를 두번 열었습니다."


End Sub

Private Sub Command2_Click()
On Error Resume Next '에러를 무시하고 지나가라. 포트를 두번 닫았을때 발생하는 에러 방지
Form2.MSComm.PortOpen = False
MsgBox "포트를 닫았습니다."
'Text1.Text = "포트를 닫았습니다."
End Sub

Private Sub Command3_Click()

    CommonDialog1.Filter = "CSV(*.csv) | *.csv"
    CommonDialog1.InitDir = App.Path       '기본적으로 저장할 위치를 지정
    CommonDialog1.DefaultExt = "*.csv"      '사용자가 파일명만 입력해도
                                            '확장자를 덧붙인다
    CommonDialog1.ShowSave

    If CommonDialog1.FileName <> "" Then
    '//파일저장
    ResultTxtSave CommonDialog1.FileName
   
    End If
   
End Sub

Public Sub ResultTxtSave(strFileName As String)
Dim FN_out As Integer '//파일저장 관련 파일오픈용
'Dim strFileName As String
Dim strtemp As String '//저장할 데이터 저장용 변수
Dim strtemp2 As String '//저장할 데이터 저장용 변수
'Dim tNO As String    '//번호
'Dim DayNow As String '//날짜
'Dim tID_NO As String '//ID_NO

'Dim I_Cnt As Long
'Dim SelData As String
'Dim TestDate As String

'Dim RawData_All As String

On Error Resume Next


'//파일저장관련 처리
FN_out = FreeFile

Open strFileName For Output As #FN_out '//파일 오픈
strtemp = Text1.Text
'strtemp2 = Text2.Text
Print #FN_out, strtemp
'Print #FN_out, strtemp2
Close #FN_out

End Sub

Private Sub Form_Load()
'// 처음 폼이 실행되면 실행되는 창 Load
End Sub

Private Sub Form_Unload(Cancel As Integer)
End
End Sub

Private Sub Timer1_Timer()
Dim Cnt_A As Long
Dim C_I As Long
Dim Temp_Data  As Variant

Dim T_A() As Long
Dim T_B() As Long
Dim T_Trans_Value As Long

Timer1.Enabled = False

Value_Data = Split(Value_Data, vbCrLf)

Cnt_A = UBound(Value_Data) '배열 갯수를 체크하기 위한 함수

'Debug.Print Cnt_A

ReDim T_A(0 To Cnt_A - 1) As Long
ReDim T_B(0 To Cnt_A - 1) As Long

For C_I = 0 To Cnt_A - 1

Temp_Data = Split(Value_Data(C_I), ",")
T_A(C_I) = Temp_Data(0)
T_B(C_I) = Temp_Data(1)

Next 'for문의 끝을 알려주는 구문

'Picture1.Scale (0, 4096)-(250, 0)
'Picture1.Print Spc(10); Tab(10); "TEST"

'Picture1.Print Spc(1); Tab(1); T_B(Cnt_A - 1) + 100
' Tab(1) 가로상 위치 화면에 비례하여 움직이기 때문에 화면 폼을 작게 하면 같은 값이라도 하면밖으로 도출될 수 있음.
'Picture1.AutoRedraw = True '다른 창 화면 보고 왔을 때도 지워지지 않게 하도록
Picture1.Picture = Nothing '화면 지우는 명령어

Picture1.AutoRedraw = False
Picture1.AutoRedraw = True
'Picture1.Print 보드(100, 200)


'Picture1.CurrentX = 10 '마지막 값 위치 설정
'Picture1.CurrentY = T_B(0) + 20 '마지막 값 위치 설정
'Picture1.Print T_B(0) '마지막 값 표시

'Picture1.Print Spc(1); Tab(1); T_B(0) '초기 시작값 표시

'Picture1.Scale (0, T_B(Cnt_A - 1) + 100)-(T_A(Cnt_A - 1) + 20, 0)

Picture1.Scale (0, T_B(0) + 100)-(T_A(Cnt_A - 1) + 20, 0)
Picture1.DrawWidth = 2 '선 굵기

Picture1.Line (T_A(0), T_B(0))-(T_A(0), T_B(0)), RGB(180, 0, 0)

Text1.Text = Text1.Text & "No" & "," & "ADC =" & "," & "Ohm =" & vbCrLf '&를 해줘야 덮어 써지지 않고 옆에 써지게 됨., vbCrLf 줄바꾸기 연산자.

For C_I = 0 To Cnt_A - 1

Picture1.Line -(T_A(C_I), T_B(C_I)), RGB(180, 0, 0)

T_Trans_Value = (56000 / ((((2.5 * T_B(C_I)) / 4096) / 0.192308) - 1))
'Text2.Text = Text2.Text & C_I + 1 & "," & T_Trans_Value & vbCrLf '&를 해줘야 덮어 써지지 않고 옆에 써지게 됨., vbCrLf 줄바꾸기 연산자.
Text1.Text = Text1.Text & Space(3) & (C_I + 1) & "," & Space(3) & T_B(C_I) & "," & Space(3) & T_Trans_Value & vbCrLf  '&를 해줘야 덮어 써지지 않고 옆에 써지게 됨., vbCrLf 줄바꾸기 연산자.
'Text1.Text = Text1.Text & C_I + 1 & "," & "ADC =" & T_B(C_I) & "," & "Ohm =" & T_Trans_Value & vbCrLf '&를 해줘야 덮어 써지지 않고 옆에 써지게 됨., vbCrLf 줄바꾸기 연산자.
'Space(숫자) 공백 넣기
Next 'for문의 끝을 알려주는 구문

Picture1.CurrentX = 10 '마지막 값 위치 설정
Picture1.CurrentY = T_B(0) + 20 '마지막 값 위치 설정
Picture1.Print T_B(0) '마지막 값 표시

Picture1.CurrentX = Cnt_A '마지막 값 위치 설정
Picture1.CurrentY = T_B(Cnt_A - 1) + 20 '마지막 값 위치 설정
Picture1.Print Spc(1); T_B(Cnt_A - 1) '마지막 값 표시

Value_Data = "" '초기화 하기 위해 ""
Buffer_Temp = "" '인티거 초기화는 0, 스트링 초기화는 ""
'If Buffer_Temp = vbCrLf Then
'처리할 행동

'ElseIf a = b Then

'Else


'End If ' C언어에서 {}의 닫는 부분


End Sub


'//통신이벤트 수신
Private Sub MSComm_OnComm() 'Form2.MSComm.PortOpen = True

Module1.Proc_Event

End Sub


Option Explicit '항상 해줘야하는 선언, 선언한 변수만 사용하겠다는 선언

Global Buffer_Temp As String '전역변수 선언
Global Value_Data As Variant

'//이벤트 발생시 처리
Public Sub Proc_Event()
   
    Dim EVMsg$
    Dim ERMsg$
    Dim Data_Length As Integer
    Dim Count_I As Integer
    Dim Buffer As String
   
    Dim Start_P As Integer
    Dim End_P As Integer
   
    Dim StrBuffer As String
   
    Dim SendData As String

    'Debug.Print BCC
    ' CommEvent 속성에 따른 항목
    Select Case Form2.MSComm.CommEvent
        ' 이벤트 메시지
       
        Case comEvReceive '//데이터 수신 이벤트
'        Form1.Picture1.AutoRedraw = False
       
        Form1.Picture1.Refresh '//그래프 박스 화면 지움
'        Form1.Picture1.Picture = Nothing
'        Form1.Picture1.Image = Nothing

        Debug.Print Buffer '직접 실행창에서 확인하기 위해
       
        Form1.Timer1.Enabled = False
        Form1.Timer1.Interval = 1000
        Form1.Timer1.Enabled = True
       
        Buffer = Buffer & Form2.MSComm.Input
       
        StrBuffer = StrConv(Buffer, vbUnicode)
        'Debug.Print StrBuffer
        'Data_Length = Len(Buffer)
        ShowData StrBuffer
       
        Buffer = ""
       
        Case comEvSend                  '//데이터 전송 이벤트
       
        Case comEvCTS
            EVMsg$ = "CTS 변경 감지" '//CTS 회선 변경
        Case comEvDSR
            EVMsg$ = "DSR 변경 감지" '//DSR 회선 변경
        Case comEvCD
            EVMsg$ = "CD 변경 감지" '//CD 회선 변경
        Case comEvRing
            EVMsg$ = "전화 벨이 울리는 중" '//호출음 검출
        Case comEvEOF
            EVMsg$ = "EOF 감지" '//파일끝 감지

        ' 오류 메시지
        Case comBreak
            ERMsg$ = "중단 신호 수신" '//중지신호 수신
        Case comCDTO
            ERMsg$ = "반송파 검출 시간 초과"
        Case comCTSTO
            ERMsg$ = "CTS 시간 초과"
        Case comDCB
            ERMsg$ = "DCB 검색 오류" '//DCB 검색 중 예기치 못한 오류
        Case comDSRTO
            ERMsg$ = "DSR 시간 초과"
        Case comFrame
            ERMsg$ = "프레이밍 오류" '//구조적 오류
        Case comOverrun
            ERMsg$ = "패리티 오류" '//데이터 손실
        Case comRxOver
            ERMsg$ = "수신 버퍼 초과" '//수신 버퍼 초과
        Case comRxParity
            ERMsg$ = "패리티 오류" '//패리티 오류
        Case comTxFull
            ERMsg$ = "전송 버퍼에 여유가 없음" '//전송버퍼 꽉참
        Case Else
            ERMsg$ = "알 수 없는 오류 또는 이벤트"
    End Select

End Sub

Public Sub ShowData(SendData As String)

Dim Data_InStr As String
Dim Data_Length As Integer


'Debug.Print SendData '직접 실행창에서 확인하기 위해

'Form1.Text1.Text = Form1.Text1.Text & SendData '&를 해줘야 덮어 써지지 않고 옆에 써지게 됨.
Buffer_Temp = Buffer_Temp & SendData
Value_Data = Buffer_Temp

'Picture1.DrawWidth = 1 '선 굵기
'Picture1.Line -(10, 3000), RGB(180, 0, 0)
'Picture1.Line -(20, 2000), RGB(180, 0, 0)
'Picture1.Line -(30, 1000), RGB(180, 0, 0)
'Picture1.Line -(40, 800), RGB(180, 0, 0)


End Sub

'폼의 화면 사이즈 맞추기 1024 * 768 = 1024*15, 768*15, 15360, 11520