diff --git a/cmd/gqgmc/main.go b/cmd/gqgmc/main.go
index 06544fced4daf13a32daf4ad42f6a47991df8c88..46cb804c7fa84cd1175fb3740c1dc15b5fb4e59d 100644
--- a/cmd/gqgmc/main.go
+++ b/cmd/gqgmc/main.go
@@ -16,7 +16,10 @@ func main() {
 	var (
 		gc       geiger.Counter
 		cps, cpm uint16
+		volts    int16
+		ser      string
 		err      error
+		ver      string
 	)
 
 	gc, err = geiger.New(geiger.Config{
@@ -41,4 +44,26 @@ func main() {
 		return
 	}
 	fmt.Printf("CPS: %d\n", cps)
+
+	ver, err = gc.Version()
+	if err != nil {
+		fmt.Printf("Failed to connect to geiger counter: '%s'\n", err)
+		return
+	}
+	fmt.Printf("Version: %s\n", ver)
+
+	ser, err = gc.SerialNum()
+	if err != nil {
+		fmt.Printf("Failed to connect to geiger counter: '%s'\n", err)
+		return
+	}
+	fmt.Printf("Version: %s\n", ser)
+
+	volts, err = gc.Volts()
+	if err != nil {
+		fmt.Printf("Failed to connect to geiger counter: '%s'\n", err)
+		return
+	}
+	fmt.Printf("Version: %d\n", volts)
+
 }
diff --git a/devices/geiger/geiger.go b/devices/geiger/geiger.go
index 74648310595da52354c39e2fd74d66558459469e..139ba58f06e620d3cf3273ec0ec8706e0ff15b5a 100644
--- a/devices/geiger/geiger.go
+++ b/devices/geiger/geiger.go
@@ -23,7 +23,7 @@ type Counter interface {
 	SerialNum() (string, error)
 	GetCPM() (uint16, error)
 	GetCPS() (uint16, error)
-	GetVoltage() (int16, error)
+	Volts() (int16, error)
 	GetHistoryData()
 	TurnOnCPS() error
 	TurnOffCPS() error
diff --git a/devices/geiger/gqgmc.go b/devices/geiger/gqgmc.go
index d58088f2b9825a15f8ff32700aba3dd3627c8999..d66dad5ccfd4c52291d6d03a9689354bb6cf7d94 100644
--- a/devices/geiger/gqgmc.go
+++ b/devices/geiger/gqgmc.go
@@ -158,7 +158,6 @@ func NewGQGMC(c Config) (*GQGMCCounter, error) {
 	if err != nil {
 		return nil, err
 	}
-	//vers := getVersion()
 	//getConfigurationData()
 	return &GQGMCCounter{port: p, config: &cfg}, nil
 }
@@ -172,26 +171,25 @@ func (gc *GQGMCCounter) Clear() error {
 
 // Version gets the version of the device
 func (gc *GQGMCCounter) Version() (string, error) {
-	//communicate(get_version_cmd, version, versize);
-	// use cmdGetVersion. Returns 14 byte string.
-	return "", nil
+	ver, err := gc.communicate(cmdGetVersion, 14)
+	return string(ver), err
 }
 
 // SerialNum gets the serial number of the device
 func (gc *GQGMCCounter) SerialNum() (string, error) {
-	//communicate(get_serial_cmd, serial_number, sernumsize);
-	// use cmdGetSerial. Returns 7 bytes.
-	// Turn each 4 bits into corresponging hex char.
-	bs := []byte{0, 0x30, 0, 0xE3, 0x4A, 0x35, 0x1A}
-	for _, b := range bs {
-		fmt.Printf("%02X", b)
+	serStr := ""
+
+	ser, err := gc.communicate(cmdGetSerial, 7)
+	if err != nil {
+		for _, b := range ser {
+			serStr += fmt.Sprintf("%02X", b)
+		}
 	}
-	fmt.Println("")
-	return "", nil
+	return serStr, err
 }
 
 func (gc *GQGMCCounter) getReading(what string) (uint16, error) {
-	buf, err := gc.communicate([]byte(what), 2)
+	buf, err := gc.communicate(what, 2)
 	if err != nil {
 		return 0, err
 	}
@@ -210,8 +208,8 @@ func (gc *GQGMCCounter) GetCPS() (uint16, error) {
 	return gc.getReading(cmdGetCPS)
 }
 
-// GetVoltage returns current battery voltage
-func (gc *GQGMCCounter) GetVoltage() (int16, error) {
+// Volts returns current battery voltage
+func (gc *GQGMCCounter) Volts() (int16, error) {
 	// Do this differently - for 9.6 return 96. And if not supported,
 	// Return -1.
 	// Public method to read voltage value of battery. The GQ GMC returns
@@ -221,15 +219,11 @@ func (gc *GQGMCCounter) GetVoltage() (int16, error) {
 	// expect to see a value higher than 100. The command is get_voltage_cmd
 	// (see GQ GMC COMMANDS above). If the voltage falls below 7.5V, GQ LLC
 	// says the geiger counter cannot be expected to operate properly.
-	//func (gc *GQGMCCounter) getBatteryVoltage()
-	//uint32_t     voltsize = 1;             // one byte of returned data
-	// Issue command to get battery voltage and read returned data.
-	//communicate(get_voltage_cmd, voltage_char, voltsize);
-	// If read of returned data succeeded, convert raw data to float,
-	//int32_t  voltage_int = int16_t(voltage_char[0]);
-	//voltage = float(voltage_int) / 10.0;
-
-	return 0, nil
+	volts, err := gc.communicate(cmdGetVoltage, 1)
+	if err != nil {
+		return 0, err
+	}
+	return int16(volts[0]), err
 }
 
 // GetHistoryData Should return history data but is unimplemented for now
@@ -253,34 +247,31 @@ func (gc *GQGMCCounter) TurnOnCPS() error {
 	// separate command. The command is turn_on_cps_cmd
 	// (see GQ GMC COMMANDS above). The returned data is always two
 	// bytes so that samples > 255 can be reported (even though unlikely).
-	//sendCmd(turn_on_cps_cmd);
-	// There is no pass/fail return from GQ GMC
+	gc.sendCmd(cmdTurnOnCPS)
 	return nil
 }
 
 // TurnOffCPS turns off CPS collection
 func (gc *GQGMCCounter) TurnOffCPS() error {
-	//sendCmd(turn_off_cps_cmd);
-	//call Clear()
+	gc.sendCmd(cmdTurnOffCPS)
+	gc.Clear()
 	return nil
 }
 
 // GetAutoCPS gets a reading once auto CPS is turned on
 func (gc *GQGMCCounter) GetAutoCPS() (uint16, error) {
-	//uint32_t cpssize = 2;          // 2 bytes of returned data
-	//read-from-port(cps_char, cpssize);
-	// 1st byte is MSB, but note that upper two bits are reserved bits.
-	// Note that shifting and bitmasking performed in uP register, so
-	// endianess is irrevelant.
-	//cps_int |= ((uint16_t(cps_char[0]) << 8) & 0x3f00);
-	//cps_int |=  (uint16_t(cps_char[1]) & 0x00ff);
-	return 0, nil
+	buf, err := gc.readCmd(2)
+	if err != nil {
+		return 0, err
+	}
+	cps := ((uint16(buf[0]) << 8) & 0x3f00)
+	cps |= (uint16(buf[1]) & 0x00ff)
+	return cps, nil
 }
 
 // TurnOffPower turns the device off
 func (gc *GQGMCCounter) TurnOffPower() {
-	//sendCmd(turn_off_pwr_cmd)
-	// Note that power off cannot fail because the GQ GMC returns nothing.
+	gc.sendCmd(cmdTurnOffPwr)
 	return
 }
 
@@ -339,7 +330,7 @@ func (gc *GQGMCCounter) SetTime(time string) {
 	//communicate(setSecondCmd, ret_char, retsize);
 }
 
-func (gc *GQGMCCounter) communicate(cmd []byte, length uint32) ([]byte, error) {
+func (gc *GQGMCCounter) communicate(cmd string, length uint32) ([]byte, error) {
 	gc.Clear()
 	if len(cmd) > 0 {
 		gc.sendCmd(cmd)
@@ -350,8 +341,8 @@ func (gc *GQGMCCounter) communicate(cmd []byte, length uint32) ([]byte, error) {
 	return nil, nil
 }
 
-func (gc *GQGMCCounter) sendCmd(cmd []byte) {
-	gc.port.Write(cmd)
+func (gc *GQGMCCounter) sendCmd(cmd string) {
+	gc.port.Write([]byte(cmd))
 	return
 }